shiro认证2--md5密码的比对(六)

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); 来计算盐值加密后的密码的值. 


1. 如何把一个字符串加密为 MD5 
2. 替换当前 Realm 的 credentialsMatcher 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可. 


密码的比对:

通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!


产生一个md5加密后的密码
public static void main(String[] args) {
      String hashAlgorithmName = "MD5";                                                           //使用MD5算法
      Object credentials = "123456";                                                                     //原始密码
      Object salt = ByteSource.Util.bytes("user");;                                              //盐
      int hashIterations = 1024;                                                                             //加密次数                                     
      Object result = new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations);
      System.out.println(result);
      }
<!--
      3. 配置 Realm
      3.1 直接配置实现了 org.apache.shiro.realm.Realm 接口的 bean
      -->
<bean id="jdbcRealm" class="com.atguigu.shiro.realms.ShiroRealm">
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<property name="hashAlgorithmName" value="MD5"></property>
<property name="hashIterations" value="1024"></property>
</bean>
</property>
</bean>

protected AuthenticationInfo doGetAuthenticationInfo(
      AuthenticationToken token) throws AuthenticationException {
   System.out.println("[FirstRealm] doGetAuthenticationInfo");

   //1. 把 AuthenticationToken 转换为 UsernamePasswordToken
   UsernamePasswordToken upToken = (UsernamePasswordToken) token;

   //2. 从 UsernamePasswordToken 中来获取 username
   String username = upToken.getUsername();

   //3. 调用数据库的方法, 从数据库中查询 username 对应的用户记录
   System.out.println("从数据库中获取 username: " + username + " 所对应的用户信息.");

   //4. 若用户不存在, 则可以抛出 UnknownAccountException 异常
   if("unknown".equals(username)){
      throw new UnknownAccountException("用户不存在!");
   }

   //5. 根据用户信息的情况, 决定是否需要抛出其他的 AuthenticationException 异常.
   if("monster".equals(username)){
      throw new LockedAccountException("用户被锁定");
   }

   //6. 根据用户的情况, 来构建 AuthenticationInfo 对象并返回. 通常使用的实现类为: SimpleAuthenticationInfo
   //以下信息是从数据库中获取的.
   //1). principal: 认证的实体信息. 可以是 username, 也可以是数据表对应的用户的实体类对象.
   Object principal = username;
   //2). credentials: 密码.
   Object credentials = null; //"fc1709d0a95a6be30bc5926fdb7f22f4";
   if("admin".equals(username)){
      credentials = "038bdaf98f2037b31f1e75b5b4c9b26e";
   }else if("user".equals(username)){
      credentials = "098d2c478e9c11555ce2823231e02ec1";
   }

   //3). realmName: 当前 realm 对象的 name. 调用父类的 getName() 方法即可
   String realmName = getName();
   //4). 盐值.
   ByteSource credentialsSalt = ByteSource.Util.bytes(username);

   SimpleAuthenticationInfo info = null; //new SimpleAuthenticationInfo(principal, credentials, realmName);
   info = new SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName);
   return info;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值