Java 春季启动应用程序。SecurityContextHolder与HttpSession之争

Java 春季启动应用程序。SecurityContextHolder与HttpSession之争,java,spring-mvc,jakarta-ee,spring-boot,java-ee-7,Java,Spring Mvc,Jakarta Ee,Spring Boot,Java Ee 7,在Web应用程序中。在会话中存储用户详细信息是很常见的,但是如果在Spring Boot中,您按照以下方式配置您的SecurityConfig类: @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(Authentic

在Web应用程序中。在会话中存储用户详细信息是很常见的,但是如果在Spring Boot中,您按照以下方式配置您的
SecurityConfig
类:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {                  

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userSecurityService)
           .passwordEncoder(passwordEncoder());
    }
...
}

然后,您可以使用always从已登录用户获取所有信息

User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()

所以。。在
HttpSession
中存储用户信息是一种不好的做法,旧做法还是我错过了什么?

Spring Security是一种安全框架,可以在web和独立应用程序中使用。
SecurityContextHolder
提供了一种统一的方式来获取
SecurityContext
以及最终的
用户

在web应用程序中使用Spring Security时,
SecurityContext
的存储被委托给
SecurityContextRepository
,使用的默认实现是
HttpSessionSecurityContextRepository
,因此最后它仍然将其存储在
HttpSession
中,但您也可以创建拥有实现并将其存储在其他位置(数据库、Redis等)

简言之,
SecurityContextHolder
是一种统一的方式,可以获取Spring Security使用的
SecurityContext
,而无需知道它在所有位置的存储方式

public class User implements Serializable, UserDetails {
..
}
User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()