对于登录页面,我有一个身份验证方法:
@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();
....
}
}我的问题是,当我试图访问initmodel()方法中的"authUser“时,它是空的。我知道身份验证方法没有返回null。但是,我在某种程度上意识到initmodel()在验证返回之前只工作几毫秒。这样它就不能正确地获取自定义对象。我如何确保/定义顺序,在不带authenticate()返回的情况下,loggedinuser不会失效?
发布于 2014-05-06 03:37:20
要真正回答您的问题,initModel()方法将在创建LoggedinUserBean对象之后立即运行。这并不意味着它的初始化。初始化和创建是两件不同的事情。创建对象时,JVM为该对象及其所有字段分配内存。所有字段都是空的,因为它们没有值,但内存留出供您填充字段。初始化意味着authUser不会为null,因为您已经给了它一个值,并且只有在调用authenticate()时才会给它一个值。只要您没有在其他地方设置authUser,那么您就没事了。
TL;DR: Security已经保证您的authUser为空,直到用户使用您的身份验证提供者之一成功地进行身份验证为止。如果在此之后,authUser保持为空,则整个springSecurityFilterChain已被尝试,则登录尝试失败。
https://stackoverflow.com/questions/23484268
复制相似问题