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

前提:

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 (过期的凭证)
……

舒服…

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值