前提:
Springboot整合Shiro后,启动项目,首次进入登录页面输入用户账号密码点击登录,却先执行AuthRealm类(继承AuthorizingRealm类)中的重写的方法doGetAuthenticationInfo(),token为登录的用户信息,该方法执行后页面报404。手动退回登录页面第二次登录输入用户账号密码点击登录, 此次流程没问题,首先执行login()方法,再次执行doGetAuthenticationInfo() 方法,token为登录用户的信息
原因一(这种原因是错误, 需要改代码)
在配置ShiroConfig的时候,没有开放登录接口。
如图1,图2
原因二(这种原因不是错误, 不需要改代码)
自己shiro配置了FormAuthenticationFilter
如图
默认拦截器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 (过期的凭证)
……
舒服…