aZuo0817 2019-05-24 14:37 采纳率: 0%
浏览 515

shiro doGetAuthenticationInfo方法中更新数据库失败

springboot整合shiro的系统遇到一点问题,在自己定义的配置类中添加一下代码

/**
 * 开启aop注解支持
 * @param securityManager
 * @return
 */
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") DefaultSecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
}

    然后登陆认证的时候,假设密码错误了,这个时候登陆失败次数加1,同时更新到数据库中,更新的时候跑出异常
 @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            if (passwordDb.equals(getSHA256Str(password))) {
            String curretnTime = DateTimeUtil.currentTimeToStr();
            user.updateUserInfo(String.valueOf(operator.getOperId()), 0, curretnTime);
        }else {
            user.updateUserInfo(String.valueOf(operator.getOperId()),loginFailureCount+1);
        }
        }

异常如下:Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - dev, rememberMe=false]

怎么解决?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 19:17
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Spring Boot中,当用户尝试登录时,如果提供的用户名和密码不匹配,Shiro将抛出一个UsernameNotFoundException。为了防止这种情况发生并确保数据库中的记录被正确地更新,你可以使用以下步骤:

    1. 在你的自定义配置类中,创建一个新的AuthenticationSuccessHandler实例,并重写其onAuthenticationSuccess方法。

    2. 在这个新实现的方法中,检查用户的登录状态(例如,如果密码错误,则应该处理)。然后,调用doGetAuthenticationInfo方法来获取当前的身份验证信息。

    3. 如果身份验证成功,你应该更新数据库中的记录。这通常涉及到对数据库进行查询、修改或删除操作。

    4. 如果身份验证失败,你需要捕获异常并在适当的地方处理它。

    下面是一个简单的示例,展示了如何在LoginFailureStrategy接口中实现一个名为CustomLoginFailureStrategy的新策略:

    import org.springframework.security.core.AuthenticationException;
    
    public class CustomLoginFailureStrategy implements LoginFailureStrategy {
    
        @Override
        public void onAuthenticationFailure(HttpServletRequest request,
                                            HttpServletResponse response,
                                            AuthenticationException exception)
                throws IOException, ServletException {
            // 在这里,你可以根据业务逻辑决定是否向客户端发送响应。
            // 比如,你可能希望显示错误消息给用户或者跳转到特定页面。
            response.sendRedirect("/error");
        }
    
    }
    

    在这个例子中,我们没有提供具体的实现细节,因为这取决于你的具体需求。但是,如果你想要更详细的信息,请告诉我。

    评论

报告相同问题?