使用来自 Spring Security 的密码来验证 REST 调用

Posted

技术标签:

【中文标题】使用来自 Spring Security 的密码来验证 REST 调用【英文标题】:Using password from spring security to authenticate REST call 【发布时间】:2016-08-12 16:13:41 【问题描述】:

我有一个 Spring Boot Web 应用程序,该应用程序具有与 LDAP 身份验证集成的 Spring Security。此 Web 应用程序在内部进行 REST 调用。这些 REST 调用具有用户名密码身份验证。这个用户名-密码与 spring security 使用的相同。无论如何我可以获得由spring security认证的用户名密码,以便在REST调用中使用。如果不是这样,有没有其他方法可以做到这一点。

提前致谢。

【问题讨论】:

【参考方案1】:

Spring Security 是根据安全属性中的规则执行的。

这意味着你只需要启用spring-security,唯一的问题是如果没有授权它会进入一个Restful客户端无法理解的Not Authorized Page。但是,如果 Restful 客户端已经过身份验证并被授予有效会话,那么它将能够通过 Security_check 并访问受保护的页面。

我猜 Spring 安全性就像 AOP 一样工作,所以每个受保护的页面都有一个 Security_check 横切,只有在身份验证存在时才允许访问该页面。

【讨论】:

【参考方案2】:

无论如何,我解决了编写自定义 AuthenticationProvider 的问题,它将执行 LDAP 身份验证并为将来的 REST 调用获取用户名密码。

【讨论】:

【参考方案3】:

我认为有一个很好的方法适合你的情况。

默认情况下,Spring Security 不会在进行身份验证后将密码存储在内存中,因此您需要更改它。使用 Java 配置,添加 configure(AuthenticationManagerBuilder) 方法:

auth.eraseCredentials(false);

然后你可以得到当前用户的用户名和密码:

String username = SecurityContextHolder.getContext().getAuthentication().getName();
Object rawPassword  = SecurityContextHolder.getContext().getAuthentication().getCredentials();

【讨论】:

以上是关于使用来自 Spring Security 的密码来验证 REST 调用的主要内容,如果未能解决你的问题,请参考以下文章

使用发送到电子邮件的动态 URL 实现 Spring Security 密码恢复的指南

Spring Security 4 2FA

Spring Security PasswordEncoder

如何使用spring security使用空密码进行基本身份验证?

Spring Security 批量密码散列

使用 Spring Security 和 OAuth2 保护 Spring Rest - 暴露用户名/密码