AuthenticationProvider& Bean @PostConstruct订购

时间:2014-05-06 00:52:39

标签: spring

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

@Component(value = "customSpringAuthentication")
public class CustomSpringAuthentication implements AuthenticationProvider {

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

         ...

         return authUser;
    }
}

我还有一个bean,在验证后调用:

@Component(value = "loggedinUserBean")
@Scope("session")
public class LoggedinUserBean {
    private AuthUser authUser;
    private boolean isAdminUser = false;

    @PostConstruct
    public void initModel() {

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

我的问题是当我尝试访问" authUser"在initmodel()方法中,它为null。 我知道authenticate方法没有返回null。但有些我意识到initmodel()在authenticate返回之前工作几毫秒。这样它就无法正确获得认证对象。如何在没有authenticate()返回的情况下确保/定义排序,而logininuser不会被初始化?

1 个答案:

答案 0 :(得分:0)

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

TL; DR:Spring Security已经保证,在用户使用您的某个身份验证提供程序成功进行身份验证之前,您的authUser为空。如果authUser在尝试完整springSecurityFilterChain之后仍为空,则登录尝试失败。