Spring安全访问用户会话创建和会话销毁事件的详细信息

时间:2014-11-15 01:56:09

标签: java spring spring-mvc spring-security

我在Web应用程序上使用Spring MVC 4和Spring Security 3.1。我有一个要求,我需要在用户登录时以及每当他注销时更新用户的详细信息。我在这里搜索了很多,并找到了解释使用Spring的HttpSessionListener和HttpSessionPublishEvent的答案。我也理解SecurityContextHolder.getContext()。getAuthentication()然后获取主体对象不会在这些监听器中工作。但是有人冒昧地试图通过

      session.getAttribute("SPRING_SECURITY_CONTEXT") 

但是我无法访问

       session.getAttribute("SPRING_SECURITY_CONTEXT")

当用户登录时,我可以获得身份验证和主体对象。在上面的两个实现中,每当调用sessionCreated / sessionDestroyed事件时,我都会将此属性视为null。

我的登录页面使用动作

呈现
      http://localhost:8081/myapp/auth/showLogin 

然后我使用表单登录登录。

 I am using custom UserDetails object as follows :.

 public class SecurityContext {

public static ChatterUserDetails getCurrentUser(){
    Object principal = SecurityContextHolder.getContext().getAuthentication().
        getPrincipal();
    if(principal instanceof MyUserDetails){
        return (MyUserDetails) principal;
    }
    MyUserDetails anonymousJkWebUserDetails = new  MyUserDetails("anonymous","anonymous",
      new ArrayList<GrantedAuthority>());                                
    anonymousJkWebUserDetails.setAnonymous(true);
    return anonymousJkWebUserDetails;
}

}

和security.xml如下(仅限相关部分):

  <http use-expressions="true">
          <intercept-url pattern="/auth/showLogin" access="permitAll()"></intercept-url>
        ....
   </http>

   <form-login login-page="/auth/showLogin" always-use-default-target="true"
        default-target-url="/auth/home" authentication-failure-url="/auth/showLogin?error=1"
        login-processing-url="/auth/login" password-parameter="userPassword" 
        username-parameter="userId" />
    <logout logout-success-url="http://${email.link.host}" logout-url="/auth/logout" delete-cookies="JSESSIONID" invalidate-session="true"></logout>

1 个答案:

答案 0 :(得分:0)

就我而言,我实施了上面详述的示例,聆听ApplicationListener<InteractiveAuthenticationSuccessEvent>并注入HttpSession https://stackoverflow.com/a/19795352/2213375

相关问题