我正在使用一个使用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
来解决此问题。但是我仍然想知道为什么事件处理程序中所做的更改不会反映在它之外。