shiro认证

Shiro实现认证(即登录)的步骤。

1. 获取当前的 Subject. 调用 SecurityUtils.getSubject();
2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated() 
3. 若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象
    1). 创建一个表单页面
    2). 把请求提交到 SpringMVC 的 Handler
    3). 获取用户名和密码. 
4. 执行登录: 调用 Subject 的 login(AuthenticationToken) 方法. 
5. 自定义 Realm 的方法, 从数据库中获取对应的记录, 返回给 Shiro.
    1). 实际上需要继承 org.apache.shiro.realm.AuthenticatingRealm 类
    2). 实现 doGetAuthenticationInfo(AuthenticationToken) 方法. 

6. 由 shiro 完成对密码的比对. 


1. 授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法

2. AuthorizingRealm 类继承自 AuthenticatingRealm, 但没有实现 AuthenticatingRealm 中的 
doGetAuthenticationInfo, 所以认证和授权只需要继承 AuthorizingRealm 就可以了. 同时实现他的两个抽象方法.

1. 为什么使用 MD5 盐值加密: 
2. 如何做到:
    1). 在 doGetAuthenticationInfo 方法返回值创建 SimpleAuthenticationInfo 对象的时候, 需要使用
    SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 构造器
    2). 使用 ByteSource.Util.bytes() 来计算盐值. 
    3). 盐值需要唯一: 一般使用随机字符串或 user id
    4). 使用 new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 来计算盐值加密后的密码的值. 

    5). 在Spring配置文件中配置Realm盐值加密(可配置多个)

<bean id="jdbcRealm" class="cn.com.shiro.realm.ShiroRealm">
     <property name="credentialsMatcher">
          <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
              <!-- 指定加密算法为MD5 -->
              <property name="hashAlgorithmName" value="MD5"></property>
              <!-- 指定加密次数为1024次 -->
              <property name="hashIterations" value="1024"></property>
          </bean>
      </property>
 </bean>

* 如何把一个字符串加密为 MD5 
* 替换当前 Realm 的 credentialsMatcher 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可. 
* 密码的比对:
通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!


发布了75 篇原创文章 · 获赞 8 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章