java - Spring Boot 应用程序。 SecurityContextHolder 与 HttpSession

标签 java spring-mvc jakarta-ee spring-boot java-ee-7

在网络应用程序中。在 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/

相关文章:

java - 在 Android 外部存储上创建的文件夹通过 MTP 不可见,但显示在 adb shell 中

java - 使用 Spring MVC 请求后接收 HTTP 状态

java - 如何将 JSON 对象解码为 Java 类?

jakarta-ee - 在我的 J2EE 应用程序中以加密形式存储外部系统的密码

java - 避免在 Kotlin 中生成对象的静态实例

java - 外部页面 div 加载时出现 jQuery 元素错误

JavaFX从另一个线程访问gui按钮操作

java - 如何与 Maven 一起运行 xml 配置驱动和无 xml Spring Web 应用程序?

java - 将 JFreeChart 图表保存到特定目录

java - 如何调试ant构建war文件