【问题标题】:Spring Security Custom AuthenticationSpring Security 自定义身份验证
【发布时间】:2014-04-20 09:36:55
【问题描述】:

我在我的 spring MVC 项目中实现了一个自定义身份验证提供程序。在我自己的重写 authenticate() 方法中,我实现了自己的身份验证,在此我构造了自己的 UserPasswordAuthenticationToken() 并返回对象。

现在上述对象“UserPasswordAuthentictionToken”中的用户ID是匿名的,密码为空,权限设置为授予该用户的权限。

问题:
这是否会导致 SecurityContextHolder 或 SecurityContext 通常丢失传递给重写的 authenticate() 方法的 Authenticate 对象中的原始传入凭据?

如果没有,我应该怎么做才能删除那些原始凭据并强制 Spring 安全上下文保存我的新匿名身份验证标识符 [当然最好与其他元数据一起]。

【问题讨论】:

  • 所以身份验证提供者是根据用户名和密码对用户进行身份验证,然后清除用户名(密码已经被spring security默认清除)并保留授予的权限,这是正确的吗?如果是这样,您能否让我们知道为什么要这样做(为什么要清除用户名),因为乍一看,没有充分的理由这样做。 spring security 支持匿名身份验证,但这与您提到的docs.spring.io/spring-security/site/docs/3.0.x/reference/… 不同
  • @jhadesdev 你在各个方面都是对的。这正是我想要做的。我这样做的原因是为了防止将用户名用于业务逻辑。没什么大不了的,但任何开发人员都可以使用 jdwp [Java 调试有线协议] 来获取用户名。我担心 jdwp [Java 调试有线协议] 存在安全漏洞。我需要阅读您提供的匿名身份验证链接,但我的登录页面已配置为匿名身份验证。

标签: spring spring-security passwords credentials security-context


【解决方案1】:

实际上,Java 远程调试功能 (JDWP) 不会构成生产中的安全漏洞,因为它默认处于关闭状态。

发生这种情况的唯一方法是有人在生产中明确打开它,但生产团队可能永远不会允许,而且他们是唯一在该机器上具有管理能力的人。

要在生产中打开调试,必须有人将这些参数添加到服务器启动脚本中,或者通过控制台设置它们:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=<PORT>

这不会意外发生。您可以通过尝试使用您的 IDE 创建到生产机器的调试远程连接来确认 JDWP 在生产中被禁用,它应该会失败。在尝试之前,最好禁用所有断点,以防万一。

如果由于某种原因在生产中启用了 JDWP,生产团队可以将服务器的防火墙配置为只允许来自某个可接受的 IP 列表的 JDWP 端口连接,从而防止开发人员远程调试生产和访问机密信息。

【讨论】:

  • 我喜欢你的回答,但在安全性方面,我不喜欢把它留给上帝的安排 :) 通过生成的调试行“意外”将战争推向生产并不难进去。我宁愿在安全方面做得过大,也不愿以后后悔。我唯一担心不这样做的时候是当加密技术造成性能瓶颈时——无论是在客户端还是在服务器上。
  • 话虽如此,我要把焦点拉回到我的问题上。如何从 SecurityContextHolder 中删除原始登录凭据并将其替换为我的匿名标识符和元数据?
猜你喜欢
  • 2014-12-13
  • 2016-08-05
  • 2020-12-05
  • 2015-04-27
  • 2014-01-12
  • 2016-09-05
  • 2021-04-21
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多