在网络应用程序中。在 session 中存储用户详细信息是很常见的,但是如果在 Spring Boot 中您按如下方式配置 SecurityConfig
类:
@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 Security 时,SecurityContext
的存储将委托(delegate)给 SecurityContextRepository
,并且使用的默认实现是 HttpSessionSecurityContextRepository
所以最终它仍然将其存储在 HttpSession 中,但您也可以创建自己的实现并将其存储在其他位置(数据库、Redis 等)。
简而言之,SecurityContextHolder
是获取 Spring Security 使用的 SecurityContext
的统一方法,而无需您在所有地方都知道它的存储方式/位置。
关于java - Spring Boot 应用程序。 SecurityContextHolder 与 HttpSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44300101/