我正在调查如何使用LDAP验证客户端ID和客户端密钥。
注意:这个Kotlin代码......
@Configuration
@EnableAuthorizationServer
class OAuth2AuthorizationServerConfig() : AuthorizationServerConfigurerAdapter() {
我对Spring相对较新,似乎这不是我应该尝试的东西?但是,它似乎是一个有用的选择。为什么?因为它允许我将客户端秘密管理委派给LDAP目录,并且有效地允许我的ops团队改变秘密(以某种托管的方式)。有了这个我的应用程序不需要知道秘密。这看起来很漂亮?
oauth终点是基本的auth - 这似乎是Spring给我的@EnableAuthorizationServer
注释。对http://somehost/oauth/token
的请求指定grant_type
:client_credentials
。
我创建了获取任意令牌(沙盒)的代码......我想要的只是指定适用于该客户端的客户端和范围,不指定秘密...
@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
以下可能表明我的经验不足,但这是一个例子,请阅读可能的疯狂 - 试着看看我是否可以注射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和客户端密钥?
答案 0 :(得分:0)
要在LDAP中拥有客户端ID和机密,您需要基于LDAP的ClientDetailsService
实现,这在Spring Security OAuth中不存在。也许将该实现构建为LDAPAuthenticationProvider
的桥梁是可行的,但我不确定这是一个好主意。无论如何,你必须自己构建实现。
答案 1 :(得分:0)
我想为社区的答案添加一些细节。
根据建议,我有一个原型工作。 我使用Apache LDAP API连接到LDAP服务器。
解决方案非常简单 - 只需创建一个ClientDetailsService
,检索与传递给loadClientByClientId
的clientId匹配的LDAP条目,并返回适当的ClientDetails
对象(使用BaseClientDetails
由Spring提供。
如果Spring为您提供了必要的代码,您还需要创建自定义PasswordEncoder
或设置正确的编码器:
override fun configure(security: AuthorizationServerSecurityConfigurer) {
security.passwordEncoder(SomePasswordEncoder)
}
默认为纯文本密码编码器。