在AuthenticationSuccessEvent侦听器中设置安全上下文

时间:2014-11-11 06:52:33

标签: java spring spring-security

我正在使用一个使用Spring Security的Web应用程序。我们正在使用遗留数据库系统,因此有必要编写自定义AuthenticationProvide r。成功验证后,我们可以加载用户的信息,例如角色,可用域等。虽然此逻辑可以包含在AuthenticationProvider中,但我们有充分的理由将其分解到外部位置。为此,我为Spring Security AuthenticationSuccessEvent编写了一个监听器:

public void onApplicationEvent(AuthenticationSuccessEvent event) {
    Authentication auth = event.getAuthentication();
    User user = (User)auth.getPrincipal(); //Custom UserDetails implementation
    List<GrantedAuthority> newAuthorities;

    //Do stuff to user and get new authorities
    SecurityContextHolder.getContext().setAuthentication(
              new UsernamePasswordAuthenticationToken(user, null, newAuthorities);
}

SecurityContext在方法中发生了变化,但之后我似乎失去了新的权限。特别是,在方法中,SecurityContext包含

UsernamePasswordAuthenticationToken@70df1ce8 

在过滤器链的末尾,我收到消息

UsernamePasswordAuthenticationToken@bbe0f021

SecurityContextPersistenceFilter保留。

我可以通过将逻辑放在AuthenticationProvider,自定义身份验证过滤器或尝试使用AuthenticationSuccessHandler来解决此问题。但是我仍然想知道为什么事件处理程序中所做的更改不会反映在它之外。

0 个答案:

没有答案