密码比对
通过AuthenticatingRealm的credentialsMatcher进行密码的比对
由于你获取数据是从数据库获取的是加密后的密码,所以挺重要的
密码加密
如何把一个字符串加密为MD5
替换当前Realm的CredentialsMatcher属性,可以使用Md5CredentialsMatcher但是推荐使用HashedCredentialsMatcher对象,并设置加密算法
加密的流程
1.为什么使用MD5盐值加密:
2.如何做到:
2.1在doGetAuthenticationInfo方法返回值创建SimpleAuthenticationInfo对象的时候,需要使用SimpleAuthenticationInfo(principal,credentials, credentialSalt,realmName);构造器 2.2 ByteSource.Util.bytes(username); 2.3盐值需要唯一:一般采用随机字符串和userId 2.4使用new SimpleHash(hashAlgorithmName,credentials,salt,hashIterations)来计算盐值加密后的密码的值
public class ShiroRealm extends AuthenticatingRealm { //认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //1.将AuthenticationToken转换为UsernamePasswordToken UsernamePasswordToken uptoken = (UsernamePasswordToken) token; //2.从UsernamePasswordToken获取username String username = uptoken.getUsername(); //3.调用数据库的方法,从数据库中查询username 对应的用户记录 System.out.println("从数据库中获取该用户名对应的记录"); //4.若用户不存在,则抛出异常UnknownAccountException if(username.equals("qweqw")){ throw new UnknownAccountException("用户不存在"); } //5.根据用户信息的情况,决定是否抛出其他异常 if(username.equals("123")){ throw new LockedAccountException("用户被锁定"); } //6.根据用户的情况,来构建AuthenticationInfo对象并返回,通常使用的实现类为SimpleAuthenticationInfo //以下信息是从数据库中获取的 //1.principal:认证的实体信息,可以是username,也可以是数据表对应的用户的实体类对象 Object principal = username; //2.credentials:密码 Object credentials = null; if("admin".equals(username)){ credentials = ""; }else if("user".equals(username)){ credentials = ""; } //3.realmName:当前realm对象的name调用父类的getName()方法即可 String realmName = getName(); //4.盐值 ByteSource credentialSalt= ByteSource.Util.bytes(username); //加密一般使用的是随机字符串或userId SimpleAuthenticationInfo info = null; info = new SimpleAuthenticationInfo(principal,credentials, credentialSalt,realmName); return info; }