【问题标题】:Spring security Principal won't work with @PostConstructSpring security Principal 不适用于@PostConstruct
【发布时间】:2020-12-02 20:49:27
【问题描述】:

我有一个 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 调用我得到用户名,有人可以帮助我吗?

编辑:我运行了一些测试,似乎身份验证为空,即使我已登录

【问题讨论】:

  • 为什么在 PostConstruct 中需要它?您不能在常规 DAO 调用期间调用该方法吗?到那时应该可以使用。
  • @SKumar 我把它放在 PostConstruct 中,因为我猜初始化发生在那里?我尝试在 service/dao 中输入它并从 PostConstruct 中调用它,我想我没有清楚地理解你,请向我解释更多

标签: java spring spring-security


【解决方案1】:

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

DAO 上的 PostConstruct 将在应用程序启动时被调用。那时,将没有登录用户。但是,当您浏览 JSF 页面时,您可能已经登录,这就是 Principal 可用的原因。

当您访问应用程序 url 时,将调用 Spring Security Filter 链。

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

@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();
    }

【讨论】:

  • 谢谢兄弟,在我遵循您的想法(而不是代码)之后,它现在正在工作
猜你喜欢
  • 2021-03-25
  • 2015-11-03
  • 2015-10-02
  • 1970-01-01
  • 2019-05-02
  • 2014-11-29
  • 2016-04-16
  • 2017-08-07
  • 2016-03-13
相关资源
最近更新 更多