是否可以在UserDetailsS​​ervice中访问Principal?

时间:2013-01-15 09:00:43

标签: spring-security

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

我是自定义实现UserDetailsService,需要以某种方式访问​​Principal。我尝试使用SecurityContextHolder.getContext().getAuthentication().getPrincipal(),因为NullPointerException为空,所以getAuthentication()会抛出。{/ p>

如何以其他方式访问Principal

2 个答案:

答案 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对象作为参数,因此我的问题得到了解决。