Shiro

北慕城南 提交于 2019-11-26 02:48:10

Shiro 身份验证底层实现

依然靠数据库完成账号验证

Shiro处理密码验证

 

Shiro正常调用流程

Controller 页面请求和页面跳转,Subject.login(token)来调用Shiro验证

AuthorizingRealm的doGetAuthenticationInfo方法,来处理验证信息

在doGetAuthenticationInfo方法中,获取HttpSession,用于存储相关信息(比如用户的真名),之后在controller获取这个Session

       private Session getSession(){ 

              try{ 

                  Subject subject = SecurityUtils.getSubject(); 

                  Session session = subject.getSession(false); 

                   if (session == null){ 

                       session = subject.getSession(); 

                   } 

                   if (session != null){ 

                       return session; 

                   } 

               }catch (InvalidSessionException e){ 

                     e.printStackTrace();

               } 

               return null; 

           }

 

Shiro主过滤器 从上至下

 

/** = user 与 token.setRememberMe(true);

当着两条配合使用时,将会实现单点登录,并且关闭浏览器,下次依然可以访问资源。因为setRememberMe(true)会在浏览器生成一个cookie名rememberMe,它是用户名序列后,Base64后的加密字符串,记住登录状态

/敏感界面 = authc 配置在 /** = user 前

当退出浏览器时,敏感界面需要再次做验证。比如支付界面

 

UsernamePasswordToken.getPassword() 获得是char数组,而不是String

原因:打开源码,shiro对没有逻辑意义的密码,有一个clear()方法来清除密码。但是String是一个final对象,是没有clear()方法的,即时是空的密码,也会在内存中被记录保留。因此shiro会将用户输入的密码转为char数组。因此shiro推荐做一次MD5加密,来二次比对数据库中被MD5加密的密码

 

MD5加密流程

  1. 数据库放入MD5加密后的密文密码,记录盐值
  2. 前台输入明文密码,被token记录
  3. Token进入方法doGetAuthenticationInfo,在new SimpleAuthenticationInfo 中完成配置文件中凭证规则的加密
  4. 匹配new SimpleAuthenticationInfo 方法中user.getPassword()获得数据库的加密密码

 

Shiro 退出登录

不需要编写controller层代码,只需要编写前台的跳转界面地址,对应shiro配置文件的

/URL = logout 即可,退出登录的操作交于shrio来处理

 

进入授权doGetAuthorizationInfo方法一共有三种情况:

 

1、subject.hasRole(“admin”) 或 subject.isPermitted(“admin”):自己去调用这个是否有什么角色或者是否有什么权限的时候;

 

2、@RequiresRoles("admin") :在方法上加注解的时候;

 

3、[@shiro.hasPermission name = "admin"][/@shiro.hasPermission]:在页面上加shiro标签的时候,即进这个页面的时候扫描到有这个标签的时候

 

被URL拦截后,除去JSESSIONID

需求版本shiro-spring-1.4.0.jar

<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">

              <!-- 去除JSESSIONID -->

              <property name="sessionIdUrlRewritingEnabled" value="false"></property>

</bean>

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!