0

我们的项目是 Spring + Spring Security + Maven + Hibernate + JSF + Icefaces

我们需要为 currentUser 定义值,但只有在用户登录后才能定义它。

public static UserDetails currentUserDetails(){
    SecurityContext securityContext = SecurityContextHolder.getContext();
    Authentication authentication = securityContext.getAuthentication();
    if (authentication != null) {
        Object principal = authentication.getPrincipal();
        return (UserDetails) (principal instanceof UserDetails ? principal : null);
    }
    return null;
}

如果我们尝试在服务器启动中包含定义,则会抛出 nullpointerException(如预期的那样)。

我们目前的方法是在 getter 方法中懒惰地定义它。因此,每当 JSF 调用它时,都会运行 HQL,但这非常昂贵。

有人可以就如何在用户已经登录后仅运行一次 currentUserDetails 方法提供建议吗?

4

1 回答 1

0

如果您在 security.xml 文件中使用<form-login>标签 - 您可以定义成功登录回调,例如

<form-login 
authentication-success-handler-ref="authenticationSuccessHandler"/>

<bean id="authenticationSuccessHandler" class="com.test.MyAuthenticationSuccessHandler"/>

和 bean impl

public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

  @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
   // use authentication object to fetch the user object and update its timestamp
   }
}

我希望它会有所帮助。祝你好运。

于 2013-07-31T18:36:38.473 回答