0

我已经实现了一个自定义AbstractPreAuthenticatedProcessingFilter,它在方法中返回一个Principal(实际上是Object根据签名)getPreAuthenticatedPrincipal(HttpServletRequest)

我正在自定义实现一个UserDetailsService需要以Principal某种方式访问​​的。我尝试过使用SecurityContextHolder.getContext().getAuthentication().getPrincipal(),它抛出了一个NullPointerException因为getAuthentication()是空的。

我如何访问Principal其他?

4

2 回答 2

1

它为 null 的原因是 spring security 无法识别到那时的委托人。从AbstractPreAuthenticatedProcessingFilter的 javadoc 中提取:

用于处理处理预身份验证请求的过滤器的基类,其中假定主体已通过外部系统的身份验证。

UserDetailService 负责加载用户对象。然后,在成功验证后,将设置包含给定用户对象的主体。

于 2013-01-15T09:05:25.223 回答
0

而不是org.springframework.security.core.userdetails.UserDetailsService,我实现org.springframework.security.core.userdetails.AuthenticationUserDetailsService<Authentication>了,这是AbstractPreAuthenticatedProcessingFilter. 这里的loadUserDetails()方法将Authentication对象作为参数,因此我的问题得到了解决。

于 2013-01-15T11:35:26.733 回答