使用 HTTP 标头和自定义数据访问配置 Spring Security 进行身份验证和授权

问题描述 投票:0回答:1

用户在应用程序外部进行身份验证,请求作为 HTTP 标头“Authorization”传入,其值为“Bearer TOKEN”。我们需要在所有应用程序端点上进行身份验证,从令牌中解析用户名,使用自定义数据访问加载角色。

我了解我需要执行以下操作:

  • 使用从 HTTP 标头获取用户名的代码创建 AuthenticationProvider 的实现
  • 使用加载用户授权的代码创建 UserDetailsService 的实现
  • 添加authorizeHttpRequests ..anyRequest().authenticated()
  • 将身份验证/授权结果获取到SecurityContextHolder中的东西
  • 在请求之间缓存授权的东西,这样就不会每次都查找
  • 将所有东西连接在一起

这听起来正确吗?
是否有推荐/正确/开箱即用的方法来实现这样的目标?

spring spring-boot spring-security
1个回答
0
投票

读完你的清单后,我会直截了当地说不,你列出的你想做的事情不是推荐的做事方式。

当我阅读您的列表时,很明显您认为 JWT 令牌应像会话 cookie 一样处理。

您不想直接从数据库向用户加载来自 JWT 的数据。这将使您的服务非常容易受到洪水攻击。

JWT 不是会话令牌,不应该这样使用。

这意味着您永远不应该将 JWT 直接分发给浏览器。令牌可能被盗,您无法远程使它们失效,并且无法将它们安全地存储在浏览器中。

包括 Spring 团队本身在内的多个安全来源建议您应该实现 BFF 模式,最好使用 Open-ID 连接标准,这意味着令牌以安全、http 的格式作为不透明令牌提供给浏览器-仅限饼干。

请求完成后,应通过某种代理将它们交换到 JWT。这样您就只能在私有企业网络内的微服务之间使用 JWT。

我建议您阅读 Open ID connect 以及 使用 pkce 的授权代码流程 BFF 模式,然后使用 Spring Security 中包含的内置 Oauth2 功能。

看在上帝的份上,不要构建一些自制的定制安全解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.