一尘不染

Spring Security自定义过滤器(更改密码)

spring

我正在使用Spring Security来保护对网站的HTTP请求。主要用途是保护页面安全,以便在尝试访问这些页面时将用户重定向到登录页面。

但是,我还有一个要求。在我的模型中,我可以将用户密码标记为临时密码,这样,当用户成功登录时,应自动强制他们更改密码。更改密码后,应将其转发到最初尝试访问的页面。

有人为此目的使用过Spring Security吗?我需要创建自己的自定义过滤器吗?

谢谢,


阅读 815

收藏
2020-04-18

共1个答案

一尘不染

在Spring Security 3.0中,你可以实现一个custom AuthenticationSuccessHandler

在此处理程序中,你可以将具有临时密码的用户重定向到密码更改页面,而不是最初请求的页面。更改密码后,你可以使用SavedRequestAwareAuthenticationSuccessHandler,将用户重定向到最初请求的页面,这是默认的处理程序实现。

public class MyHandler implements AuthenticationSuccessHandler {
    private AuthenticationSuccessHandler target = new SavedRequestAwareAuthenticationSuccessHandler();

    public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication auth) {
        if (hasTemporaryPassword(auth)) {
            response.sendRedirect("/changePassword");
        } else {
            target.onAuthenticationSuccess(request, response, auth);
        }
    }

    public void proceed(HttpServletRequest request, 
        HttpServletResponse response, Authentication auth) {
        target.onAuthenticationSuccess(request, response, auth);
    }
}

@Controller("/changePassword")
public class ChangePasswordController {

    @Autowired
    private MyHandler handler;

    @RequestMapping(method = POST)
    public void changePassword(HttpServletRequest request, 
        HttpServletResponse response,
        @RequestParam(name = "newPassword") String newPassword) {

        // handle password change
        ...

        // proceed to the secured page
        handler.proceed(request, response, auth);        
    }
2020-04-18