JWT+Shiro的整体流程说明
JWTToken-->AuthenticationToken 详见代码
UserPrincipal-->LockedPrincipal-->JWTPrincipal---subject secret两个字段 详见代码
AuthService有关jwt的所有逻辑的封装与处理 详见代码
-------------------------------------------------------------------
0.登录时调用AuthService.java的buildJWTToken 生成jwt
1.根据Header里的获取httpRequest.getHeader(AUTHORIZATION_HEADER);拿到token形成JWTToken
2.AuthRealm的认证方法逻辑doGetAuthenticationInfo
通过AuthenticationToken拿到JWTPrincipal对象-->通过jwt的decode拿到ID然后构建JWTPrincipal对象
然后根据JWTPrincipal的secret方法加密认证token的合法性
构建Principal对象与token构造SimpleAuthenticationInfo对象
3.AuthRealm的权限方法doGetAuthorizationInfo
增加权限
-----------------------------------------------------------------------
整体配制代码
1.AuthRealm 继承AuthorizingRealm
doGetAuthorizationInfo //获取用户权限或角色信息
doGetAuthenticationInfo //进行身份验证eg:用户名与password密码的校验
//并且会设置具体的principal
AuthRealm注入到spring详见参考代码 (realm.setAuthenticationTokenClass(JWTToken.class);//设置具体的Au..Token)
AuthRealm本身自定义的代码 涉及到的参考类AuthService代码
2.securityManager--->指定具体的 AuthRealm
securityManager禁用Shiro的Session持久化功能,以此为Restful提供无状态 详见参考代码
3.LifecycleBeanPostProcessor 注入这个bean用来管理shiro一些bean的生命周期
生命周期就是初始化 与 销毁的管理 详见参考代码
4.DefaultAdvisorAutoProxyCreator是用来扫描上下文,寻找所有的Advistor(通知器)必须在lifecycleBeanPostProcessor创建之后创建 详见如下代码
@Bean
@DependsOn("lifecycleBeanPostProcessor")
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
creator.setProxyTargetClass(true);
return creator;
}
5.AuthorizationAttributeSourceAdvisor权限注解的advisor 支持权限注解的通知器,详见如下代码
@Bean//入参的SecurityManager类型为org.apache.shiro.mgt.SecurityManager 而不是java.lang.SecurityManager别引用错了
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
6.设置ShiroFilterFactoryBean
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager); //设置securityManager
shiroFilter.getFilters().put("jwt", new JWTFilter(authService));// 设置一个自定义的过滤器
shiroFilter.setFilterChainDefinitionMap(chain.getFilterChainMap());//设置一个过滤链的定义
关于FilterChainDefinitionMap参数说明文章
ShiroFilterFactoryBean注入详见参考示例代码
JWTFilter_BasicHttpAuthenticationFilter_参考未例代码