Shiro MD5加密算法验证登入Demo

通常为了安全,用户保存在数据库的密码都是密文密码,即通过加密算法加密以后的密码。那么如果我们想要前台输入的明文密码和数据库中的加密密码进行验证,使用户进行登入,那么就需要对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;
    }

设置默认解析为Hex还是base64

二 在自定义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";
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值