通常为了安全,用户保存在数据库的密码都是密文密码,即通过加密算法加密以后的密码。那么如果我们想要前台输入的明文密码和数据库中的加密密码进行验证,使用户进行登入,那么就需要对shiro进行配置,使用户密码能正常验证。
一 配置Realm的CredentialsMatcher属性
默认CredentialsMatcher是没有使用加密算法对前台密码进行加密的
在配置文件中对Realm进行设置
// 创建Realm对象,需要自定义类: 1:Realm
@Bean(name = "userRealm")
public UserRealm userRealm(){
UserRealm realm = new UserRealm();
// 创建一个密码验证算法捕获器
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
// 设置密码验证为MD5加密验证
hashedCredentialsMatcher.setHashAlgorithmName("MD5");
// 加密次数为 1 次
hashedCredentialsMatcher.setHashIterations(1);
// 配置加密验证控制器
realm.setCredentialsMatcher(hashedCredentialsMatcher);
return realm;
}
二 在自定义Realm中放入加密salt,和数据库中的密码
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("用户进行登入操作 subject.login(token) 以后会进入UserRealm 的 doGetAuthenticationInfo(方法中)");
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
// 从数据库获取用户信息
User user = userService.queryUserByName(token.getUsername());
if (user == null) {
System.out.println("用户不存在");
return null;
}
ByteSource salt = ByteSource.Util.bytes(user.getName());
// SimpleAuthenticationInfo 具有密码验证功能,通过配置算法验证捕获器,将数据库密码和前台密码进行盐值加密后进行验证
return new SimpleAuthenticationInfo(token.getPrincipal(),user.getPassword(), salt,"");
}
用户注册
@PostMapping("/register")
public String register(Model model, User user){
// 计算盐值
Object salt = ByteSource.Util.bytes(user.getName());
SimpleHash simpleHash = new SimpleHash("MD5",user.getPassword(),salt,1);
// 放入加密 密码
user.setPassword(simpleHash.toString());
userMapper.insertUser(user);
model.addAttribute("msg","用户注册成功");
return "index";
}
用户登入
@PostMapping({"/login"})
public String Login(Model model,String username,String password){
// 获取当前用户
Subject subject = SecurityUtils.getSubject();
// 封装用户信息的登入数据
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
try {
// 用户进行登入操作
subject.login(token);
}catch (UnknownAccountException e){
model.addAttribute("msg","该用户不存在");
return "login";
}catch (IncorrectCredentialsException e){
model.addAttribute("msg","该用户密码错误");
return "login";
}catch (AuthenticationException ae) {
model.addAttribute("msg","其他异常(加密算法问题...)");
}
return "login";
}