shiro的登录账号密码校验过程,SimpleAuthenticationInfo的参数定义

SimpleAuthenticationInfo的参数解释:

第一个参数:可以传username登录名,也可传user对象,后面SecurityUtils.getSubject().getPrincipal();这个方法会把这个值取出来。需要取用户名还是整个用户对象,你这个参数传什么那里就取什么。

第二个参数:传密码,可以是加密前也可以是加密后的密码。如果传加密前的密码,那你需要在SimpleAuthenticationInfo上面写一个自己密码验证的方法;如果你传加密后的密码,那你在UsernamePasswordToken那里就需要传加密后的密码;因为最终是比较UsernamePasswordToken传的密码和SimpleAuthenticationInfo传的密码;

第三个参数:是盐,一般可以不写;

第四个参数:getName()就好,也可以填空;

下面给一个传加密后的密码做比较例子。(传加密后的密码是SimpleAuthenticationInfo自己去比较,不用手动自己比较密码)

LoginController的方法

    @PostMapping("/login")
    @ResponseBody
    public AjaxResult ajaxLogin(@RequestBody HashMap map)
    {
		if (StringUtils.isEmpty(map.get("username")) || StringUtils.isEmpty(map.get("password"))){
			return error("用户或密码不能为空");
        }
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(map.get("username"), ShiroUtils.encryptPassword(map.get("username"), map.get("password")), false);
        try
        {
            subject.login(token);
            return success(ShiroUtils.getSysUser());
        }
        catch (AuthenticationException e)
        {
            String msg = "密码错误";
            if (StringUtils.isNotEmpty(e.getMessage())){
            	if(e.getMessage().contains("did not match the expected credentials.")) {
            		return error(msg);
            	}
            	msg = e.getMessage();
            }
            return error(msg);
        }
    }

UserRealm的认证方法

    /**
     * 登录认证
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException
    {
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        Map user = userMapper.selectByUsername(username);
        if(user==null) {
        	throw new AuthenticationException("用户不存在");
        }
        String db_password=user.get("US_PASSWORD").toString();
        user.remove("US_PASSWORD");
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, db_password, getName());
        return info;
    }

 

正在加载评论...