Spring 启动应用程序。 SecurityContextHolder 与 HttpSession
Spring Boot apps. SecurityContextHolder vs. HttpSession
在网络应用程序中。在会话中存储用户详细信息是很常见的,但是如果在 Spring 引导中你配置你 SecurityConfig
class 如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userSecurityService)
.passwordEncoder(passwordEncoder());
}
...
}
和
@Service
public class UserSecurityService implements UserDetailsService {
/** The application logger */
private static final Logger LOG = LoggerFactory.getLogger(UserSecurityService.class);
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
LOG.info("Searching user with email: " + email);
User user = userRepository.findByEmail(email);
if (null == user) {
LOG.warn("Username {} not found", email);
throw new UsernameNotFoundException("Username " + email + " not found");
}
return user;
}
}
和
public class User implements Serializable, UserDetails {
..
}
然后您可以使用 always
从登录用户获取所有信息
User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()
所以..将用户信息存储在 HttpSession
中是一种不好的做法,旧做法还是我错过了什么?
Spring Security 是一个安全框架,可用于 Web 和独立应用程序。 SecurityContextHolder
提供了获取 SecurityContext
和最终 User
的统一方式。
当在 Web 应用程序中使用 Spring 安全性时,SecurityContext
的存储被委托给 SecurityContextRepository
并且使用的默认实现是 HttpSessionSecurityContextRepository
所以在最后它仍然将其存储在 HttpSession
中,但您也可以创建自己的实现并将其存储在其他位置(数据库、Redis 等)。
简而言之,SecurityContextHolder
是获得 Spring 使用的 SecurityContext
安全性的统一方式,您无需在所有地方都知道 how/where 它是存储。
在网络应用程序中。在会话中存储用户详细信息是很常见的,但是如果在 Spring 引导中你配置你 SecurityConfig
class 如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userSecurityService)
.passwordEncoder(passwordEncoder());
}
...
}
和
@Service
public class UserSecurityService implements UserDetailsService {
/** The application logger */
private static final Logger LOG = LoggerFactory.getLogger(UserSecurityService.class);
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
LOG.info("Searching user with email: " + email);
User user = userRepository.findByEmail(email);
if (null == user) {
LOG.warn("Username {} not found", email);
throw new UsernameNotFoundException("Username " + email + " not found");
}
return user;
}
}
和
public class User implements Serializable, UserDetails {
..
}
然后您可以使用 always
从登录用户获取所有信息User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()
所以..将用户信息存储在 HttpSession
中是一种不好的做法,旧做法还是我错过了什么?
Spring Security 是一个安全框架,可用于 Web 和独立应用程序。 SecurityContextHolder
提供了获取 SecurityContext
和最终 User
的统一方式。
当在 Web 应用程序中使用 Spring 安全性时,SecurityContext
的存储被委托给 SecurityContextRepository
并且使用的默认实现是 HttpSessionSecurityContextRepository
所以在最后它仍然将其存储在 HttpSession
中,但您也可以创建自己的实现并将其存储在其他位置(数据库、Redis 等)。
简而言之,SecurityContextHolder
是获得 Spring 使用的 SecurityContext
安全性的统一方式,您无需在所有地方都知道 how/where 它是存储。