对于登录页面,我有一个身份验证方法:
@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不会被初始化?
答案 0 :(得分:0)
要实际回答您的问题,将在创建LoggedinUserBean对象后立即运行initModel()
方法。这并不意味着它的初始化。初始化和创建是两个独立的事情。创建对象时,JVM会为该对象及其所有字段分配内存。所有字段都为null,因为它们没有值,但会留出内存供您填充字段。初始化意味着authUser
不会为null,因为您已为其赋值,并且只有在调用authenticate()
时才给它一个值。只要您没有在其他任何地方设置authUser
,那么您就可以了。
TL; DR:Spring Security已经保证,在用户使用您的某个身份验证提供程序成功进行身份验证之前,您的authUser
为空。如果authUser
在尝试完整springSecurityFilterChain
之后仍为空,则登录尝试失败。