首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AuthenticationProvider & Bean @PostConstruct排序

AuthenticationProvider & Bean @PostConstruct排序
EN

Stack Overflow用户
提问于 2014-05-06 00:52:38
回答 1查看 277关注 0票数 0

对于登录页面,我有一个身份验证方法:

代码语言:javascript
复制
@Component(value = "customSpringAuthentication")
public class CustomSpringAuthentication implements AuthenticationProvider {

    @SuppressWarnings({ "serial", "deprecation" })
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {

         ...

         return authUser;
    }
}

此外,我还有一个bean,它在身份验证之后被调用:

代码语言:javascript
复制
@Component(value = "loggedinUserBean")
@Scope("session")
public class LoggedinUserBean {
    private AuthUser authUser;
    private boolean isAdminUser = false;

    @PostConstruct
    public void initModel() {

        ....
        authUser = (AuthUser) SecurityContextHolder.getContext().getAuthentication();
        ....
    }
}

我的问题是,当我试图访问initmodel()方法中的"authUser“时,它是空的。我知道身份验证方法没有返回null。但是,我在某种程度上意识到initmodel()在验证返回之前只工作几毫秒。这样它就不能正确地获取自定义对象。我如何确保/定义顺序,在不带authenticate()返回的情况下,loggedinuser不会失效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-06 03:37:20

要真正回答您的问题,initModel()方法将在创建LoggedinUserBean对象之后立即运行。这并不意味着它的初始化。初始化和创建是两件不同的事情。创建对象时,JVM为该对象及其所有字段分配内存。所有字段都是空的,因为它们没有值,但内存留出供您填充字段。初始化意味着authUser不会为null,因为您已经给了它一个值,并且只有在调用authenticate()时才会给它一个值。只要您没有在其他地方设置authUser,那么您就没事了。

TL;DR: Security已经保证您的authUser为空,直到用户使用您的身份验证提供者之一成功地进行身份验证为止。如果在此之后,authUser保持为空,则整个springSecurityFilterChain已被尝试,则登录尝试失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23484268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档