使用LDAPvalidationSpring oauth / token请求上的客户端ID和客户端密钥
我正在调查客户端ID和客户端密码如何通过LDAP进行身份validation。
注意:这个Kotlin代码…
@Configuration @EnableAuthorizationServer class OAuth2AuthorizationServerConfig() : AuthorizationServerConfigurerAdapter() {
我对Spring比较陌生,看来这不是我应该尝试的吗? 但是,这似乎是一个有用的选择。 为什么? 因为它允许我将客户端秘密管理委托给LDAP目录,并且有效地允许我的操作团队改变秘密(以某种管理的方式)。 有了这个我的应用程序不需要知道这个秘密。 这似乎很整齐?
oauth的终点是基本认证 – 这似乎是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
向管理的提供者集合中添加一个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来validation客户端ID和客户端的秘密?
要在LDAP中拥有客户端ID和密码,您需要一个基于LDAP的ClientDetailsService
实现,而这在Spring Security OAuth中不存在。 也许将这个实现构建成LDAPAuthenticationProvider
的桥梁是可行的,但是我不确定这是一个好主意。 无论如何,你必须自己构建实现。
我想为社区的答案添加一些细节。
我有一个原型工作得益于这个建议。 我正在使用Apache LDAP API连接到LDAP服务器。
该解决方案相当简单 – 只需创建一个ClientDetailsService
,它检索与传递给loadClientByClientId
的clientId相匹配的LDAP条目,并返回相应的ClientDetails
对象(使用BaseClientDetails
提供的BaseClientDetails
)。
你还需要创建一个自定义的PasswordEncoder
或者设置正确的编码器,如果Spring给你必要的:
override fun configure(security: AuthorizationServerSecurityConfigurer) { security.passwordEncoder(SomePasswordEncoder) }
默认值是纯文本密码编码器。