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 它是存储。