解决:shiro中重写doGetAuthenticationInfo,结果首次登录先执行doGetAuthenticationInfo后执行login的问题

前提:

Springboot整合Shiro后,启动项目,首次进入登录页面输入用户账号密码点击登录,却先执行AuthRealm类(继承AuthorizingRealm类)中的重写的方法doGetAuthenticationInfo(),token为登录的用户信息,该方法执行后页面报404。手动退回登录页面第二次登录输入用户账号密码点击登录, 此次流程没问题,首先执行login()方法,再次执行doGetAuthenticationInfo() 方法,token为登录用户的信息

原因一(这种原因是错误, 需要改代码)

在配置ShiroConfig的时候,没有开放登录接口。

如图1,图2
解决:shiro中重写doGetAuthenticationInfo,结果首次登录先执行doGetAuthenticationInfo后执行login的问题_第1张图片
解决:shiro中重写doGetAuthenticationInfo,结果首次登录先执行doGetAuthenticationInfo后执行login的问题_第2张图片


原因二(这种原因不是错误, 不需要改代码)

自己shiro配置了FormAuthenticationFilter

如图
解决:shiro中重写doGetAuthenticationInfo,结果首次登录先执行doGetAuthenticationInfo后执行login的问题_第3张图片
默认拦截器FormAuthenticationFilter 只拦截post请求, 我们在登录的时候,如果用户名为username,密码为password,那么我们可以不用自己写登录的代码,FormAuthenticationFilter这个过滤器会自动帮我们进行登陆验证

这种情况下, 当登陆报错了才会进来login方法中来。若身份验证成功的话,会直接跳转到之前的访问地址或是successfulUrl去。因为在FormAuthenticationFilter内部都已经做完认证了。我们只需要在login方法中写上(判断异常类型)验证失败的逻辑就好,

@RequestMapping(value = "login",method = RequestMethod.POST)
public string loginSubmit(Param param) {
    String errorClassName = (String) ServletHelper.getRequestAttribute(FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME);
    if(UnknownAccountException.class.getName().equals(errorClassName)) {
        ServletHelper.setRequestAttribute("error", "用户名/密码错误");
    } else if(IncorrectCredentialsException.class.getName().equals(errorClassName)) {
        ServletHelper.setRequestAttribute("error", "用户名/密码错误");
    } else if(errorClassName != null) {
        ServletHelper.setRequestAttribute("error", "未知错误:" + errorClassName);
    }
    // 登录失败后,跳回到login画面,让用户再次登录
    return "admin/login";
}

//DisabledAccountException (禁用的帐号)
//LockedAccountException (锁定的帐号)
//UnknownAccountException(错误的帐号)
//ExcessiveAttemptsException(登录失败次数过多)
//IncorrectCredentialsException (错误的凭证)
//ExpiredCredentialsException (过期的凭证)
……

舒服…

你可能感兴趣的:(Shiro)