Shiro入门学习三

本文详细介绍了Shiro的身份验证流程,包括JavaSE和Web环境下的认证示例。讲解了单个和多个Realm的配置与认证策略,如FirstSuccessfulStrategy和AllSuccessStrategy。此外,还阐述了在Web环境中如何完成用户认证,强调了Realm在数据交互中的作用,以及如何实现MD5加密处理用户密码。
摘要由CSDN通过智能技术生成

Shiro入门学习三

认证

身份认证流程参考官网Authentication Sequence

这里写图片描述

流程如下,参考自第二章 身份验证——《跟我学Shiro》

  1. 首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtils. setSecurityManager()设置;
  2. SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;
  3. Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现;
  4. Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证;
  5. Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问。

JavaSE例子

单个realm

创建一个MapRealm实现Realm接口,主要要实现3个方法:

  • public String getName()返回realm的名称
  • public boolean supports(AuthenticationToken token)判断此Realm是否支持此Token
  • public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)根据Token获取认证信息

如下所示的MapRealm

public class MapRealm implements Realm{
   

    private static Map<String, String> users;
    static{
        users = new HashMap<String, String>();
        users.put("kh", "123");
        users.put("laozhag", "123");
    }

    @Override
    public String getName() {
        return "MapRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        String username = token.getPrincipal().toString();
        String password = new String((char[])(token.getCredentials()));

        System.out.println("username: "  + username + " password: "+password);

        if (!users.containsKey(username)) {
            throw new UnknownAccountException("用户名出错");
        }
        if (!password.equals(users.get(username))) {
            throw new IncorrectCredentialsException("密码出错");
        }

        AuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());

        return info;
    }

}

然后,在shiro.ini中配置securityManagerrealms,这里先配置一个:

[main]
mapRealm=com.wz.shiro.realm.MapRealm
securityManager.realms = $mapRealm

Junit测试过程如下:

    @Test
    public void testBase(){

        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        Subject subject
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值