Spring Security:在注销期间从会话中获取一些数据

时间:2017-01-26 06:14:54

标签: java spring spring-mvc session spring-security

在我的Spring Security网络应用程序中,我使用spring-security.xml进行登录和注销。在我的<form-login login-page="/login" default-target-url="/" authentication-failure-url="/login?error" username-parameter="username" password-parameter="password" /> <logout logout-success-url="/login?logout" /> 中,我有以下内容:

request.getSession().setAttribute("USERTO", userTO);

在登录期间,我将会话的用户详细信息设置为TO,如下所示:

userTO

其中UserTO是具有@RequestMapping(value = "/login", method = RequestMethod.GET) public String login(ModelMap model, @RequestParam(value = "error", required = false) String error, @RequestParam(value = "logout", required = false) String logout) { try { UserTO user = (UserTO) httpSession.getAttribute("USERTO"); if (error != null) { //error during login } if (logout != null) { //succesful logout } model.addAttribute("smartWCMLayoutID", "smartly"); model.addAttribute("cm", new CommonModel("", "", "")); return "smartwcm.login.definition"; } catch(Exception ex) { } } 类型用户详细信息的对象。我的注销控制器方法如下:

UserTO

但在注销期间,我总是将let findMax l = let rec helper(l,m) = match l with | [] -> m | (x::xs) -> helper(xs, if (Some x > m) then Some x else m) helper (l,None) 视为空。是否有任何方法可以在注销前从会话中捕获该值。

1 个答案:

答案 0 :(得分:0)

我不会直接回答,但会向您展示另一种方法。我总是将以下课程附加到我的春季安全项目中:

public class LoggedUserUtils {
    public static User getLoggedUser() {
        final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        final Object principal = auth.getPrincipal();

        if (principal instanceof User) {
            return (User) principal;
        }
        return null;
    }
}

它使用SecurityContext存储UserDetails。我总是在UserDetails类中实现User接口,因此它可以工作。

您可以在每个控制器,服务或存储库中使用上述静态方法(但我认为只有服务层是合适的,最终也是控制器)。如果通过不安全端点输入的呼叫没有进行身份验证,它将返回null