我正在研究如何使用 LDAP 对客户端 ID 和客户端密码进行身份验证。
注意:这段 Kotlin 代码...
@Configuration
@EnableAuthorizationServer
class OAuth2AuthorizationServerConfig() : AuthorizationServerConfigurerAdapter() {
我对 Spring 比较陌生,这似乎不是我应该尝试的事情?但是,这似乎是一个有用的选择。为什么?因为它允许我将客户端 secret 管理委托(delegate)给 LDAP 目录,并且有效地允许我的操作团队更改 secret (当然是以某种托管方式)。有了这个,我的应用程序就不需要知道 secret 了。这看起来很整洁?
oauth 端点是基本身份验证 - 这似乎是 Spring 通过 @EnableAuthorizationServer
注释给我的。对 http://somehost/oauth/token
的请求指定 grant_type
:client_credentials
。
我创建了代码来获取任意 token (沙盒)...我想要的是仅指定适用于该客户端的客户端和范围,不指定 secret .. .
@Throws(Exception::class)
override fun configure(
clients: ClientDetailsServiceConfigurer
) {
// Inlining will create a store per credential entry
val serviceBuilder = clients.inMemory()
serviceBuilder.withClient("user").secret("test").scopes("XXX")
}
我尝试了很多不同的想法来将 LDAP Authentication Provider
添加到 ProviderManager
中的托管提供程序集中,但到目前为止都失败了。如果我在运行时调试到 authenticate
方法,我总是只有 AnonymousAuthenticationProvider
和 DaoAuthenticationProvider
以下可能表明我缺乏经验,但这里有一个例子,请阅读过去可能的疯狂 - 只是想看看我是否可以注入(inject) LDAPAuthenticationProvider
...
@Autowired
lateinit var providerMan: AuthenticationManager
@Throws(Exception::class)
override fun configure(endpoints: AuthorizationServerEndpointsConfigurer) {
(providerMan as ProviderManager).providers.add(0,
LdapAuthenticationProvider(
PasswordComparisonAuthenticator(PasswordPolicyAwareContextSource("ldap://something"))
)
)
}
因此问题很简单......
有没有办法添加 LdapAuthenticationProvider
,这样我就可以使用 LDAP 来验证客户端 ID 和客户端密码?
最佳答案
要在 LDAP 中拥有客户端 ID 和 secret ,您需要一个基于 LDAP 的 ClientDetailsService
实现,而这在 Spring Security OAuth 中不存在。也许将该实现构建为通向 LDAPAuthenticationProvider
的桥梁是可行的,但我不确定这是否是个好主意。在任何情况下,您都必须自己构建实现。
关于spring-security - 使用 LDAP 在 Spring oauth/token 请求上验证客户端 ID 和客户端密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654430/