我已经实施了一个自定义AbstractPreAuthenticatedProcessingFilter
,它会在方法Principal
中返回Object
(根据签名实际为getPreAuthenticatedPrincipal(HttpServletRequest)
。
我是自定义实现UserDetailsService
,需要以某种方式访问Principal
。我尝试使用SecurityContextHolder.getContext().getAuthentication().getPrincipal()
,因为NullPointerException
为空,所以getAuthentication()
会抛出。{/ p>
如何以其他方式访问Principal
?
答案 0 :(得分:1)
它为null的原因是spring安全性无法识别到那时为止的主体。摘自AbstractPreAuthenticatedProcessingFilter的javadoc:
用于处理处理预先验证的过滤器的基类 身份验证请求,假定主体具有 已经通过外部系统验证。
UserDetailService负责加载用户对象。然后,在成功验证后,将设置包含给定用户对象的principal。
答案 1 :(得分:0)
而不是org.springframework.security.core.userdetails.UserDetailsService
,我实施了org.springframework.security.core.userdetails.AuthenticationUserDetailsService<Authentication>
,这是AbstractPreAuthenticatedProcessingFilter
的实际必要性。其中的loadUserDetails()
方法将Authentication
对象作为参数,因此我的问题得到了解决。