1

实现步骤

查考官网实现步骤http://shiro.apache.org/spring-boot.html
1)创建一个类去继承AuthorizingRealm,目的在于间接实现Realm(实现类)
实现其中的方法
    doGetAuthenticationInfo 获取封装认证信息
    doGetAuthorizationInfo  获取封装授权信息
2)创Realm 的Bean对象,交给Spring管理 
  @Bean
    public Realm realm() {
        return new ShiroRealm();
     
3)定义过滤规则
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    //定义过滤链对象
 DefaultShiroFilterChainDefinition chainDefinition =
            new DefaultShiroFilterChainDefinition();
    //设置登录操作不需要认证(其中,anon表示匿名访问处理)
 chainDefinition.addPathDefinition("/user/login/**", "anon");
    //设置登出操作,登出以后要跳转到登录页面(其中,logout表示系统登出处理)
 chainDefinition.addPathDefinition("/user/logout", "logout");
    //设置哪些资源需要认证才可访问
 //这里表示对这个url(例如/user/**),要调用过滤链中的哪个过滤器(例如authc)进行处理
 //chainDefinition.addPathDefinition("/user/**", "authc");
 //chainDefinition.addPathDefinition("/**", "authc"); chainDefinition.addPathDefinition("/**", "user");
    return chainDefinition;
}
4)spring的配置
shiro:loginUrl:/login.html

###登录认证流程

![image.png](/img/bVcQQzi)

1) 系统调用 subject 的 login 方法将用户信息提交给 SecurityManager
2) SecurityManager 将认证操作委托给认证器对象 Authenticator
3) Authenticator 将用户输入的身份信息传递给 Realm。
4) Realm 访问数据库获取用户信息然后对信息进行封装并返回。
5) Authenticator 对 realm 返回的信息进行身份认证

1.获取当前用户
Subject currentUser = SecurityUtils.getSubject();

2.判断用户是否登录
currentUser.isAuthenticate();

3.将用户名密码封装成tonken
UsernamePasswordToken tonken = new UsernamePasswordToken(“username”,“password”);

4.通过捕获执行currentUser.login(tonken)的异常来验证登录
ConcurrentAccessException:并发访问异常(多个用户同时登录时抛出)
UnknownAccountException uae:用户名不存在
IncorrectCredentialsException ice:密码错误
LockedAccountException lae:用户被锁住
ExpiredCredentialsException:凭证过期
ExcessiveAttemptsException:认证次数超过限制
UnsupportedTokenException:使用了不支持的Token

5.currentUser.login(tonken)是调用Realm中的getAuthenticationInfo方法拿到一个AuthenticationInfo对象info,再调用CredentialsMatcher的doCredentialsMatch方法将token(代表了用户输入的那一块)和info(代表了数据库中取出的那一块)进行比对。

获取封装信息代码

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
     SysUser user=(SysUser) principalCollection.getPrimaryPrincipal();
    Set<String> permissionSet=sysMenuDao.selectUserPermissions(user.getId());
    SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
    info.setStringPermissions(permissionSet);
    return info;
}

真理求知者
4 声望0 粉丝

在黑暗在探索光明,在迷茫中寻找真理!