Spring Security Principal无法与@PostConstruct一起使用

问题描述

我有一个Managedbean,其中包含此函数,该函数返回登录用户用户名

public String getConnectedUser( ){  
    SecurityContext context = SecurityContextHolder.getContext();
    Authentication authentication = context.getAuthentication();
    if (authentication == null)
        return null;
    Object principal = authentication.getPrincipal();
    if (principal instanceof UserDetails) {
        return ((UserDetails) principal).getUsername();
    } else {
        return principal.toString();
    }

我想使用从Spring Security获得的用户名用户与我的DAO一起使用。 当我在@postconstruct方法调用它时,它不会返回任何内容

    @postconstruct
public void init() {

user = utilisateurService.getUtilisateurByLogin( getConnectedUser());

但是当我在JSF中调用它时,它显示了正确的登录用户名

        <h:outputText
            value="Logged as : #{testMB.getConnectedUser()}" />

最后:使用Init函数,视图中什么也看不到,通过JSF调用,我获得了用户名,有人可以帮我吗?

编辑:我运行了一些测试,并且即使我已经登录,认证也似乎为空

解决方法

我认为Spring Security主体在PostConstruct中不可用是有道理的。

在应用程序启动时,将在DAO上调用

PostConstruct。那时,将没有登录用户。但是,当您浏览JSF页面时,您可能已经登录了,这就是为什么Principal在那里可用的原因。

当您访问应用程序URL时,将调用Spring Security筛选器链。

我建议您在常规DAO方法调用期间调用此方法。如果您已登录,则“主体”应该可用。

@Repository
public class SomeDao
{

public String someDaoMethod() {
  getConnectedUser();
  ....
}
private String getConnectedUser( ){  
    SecurityContext context = SecurityContextHolder.getContext();
    Authentication authentication = context.getAuthentication();
    if (authentication == null)
        return null;
    Object principal = authentication.getPrincipal();
    if (principal instanceof UserDetails) {
        return ((UserDetails) principal).getUsername();
    } else {
        return principal.toString();
    }