使用LDAP

时间:2017-12-05 13:08:58

标签: spring-security spring-oauth2

我正在调查如何使用LDAP验证客户端ID和客户端密钥。

注意:这个Kotlin代码......

@Configuration
@EnableAuthorizationServer
class OAuth2AuthorizationServerConfig() : AuthorizationServerConfigurerAdapter() {

我对Spring相对较新,似乎这不是我应该尝试的东西?但是,它似乎是一个有用的选择。为什么?因为它允许我将客户端秘密管理委派给LDAP目录,并且有效地允许我的ops团队改变秘密(以某种托管的方式)。有了这个我的应用程序不需要知道秘密。这看起来很漂亮?

oauth终点是基本的auth - 这似乎是Spring给我的@EnableAuthorizationServer注释。对http://somehost/oauth/token的请求指定grant_typeclient_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方法,我只能使用AnonymousAuthenticationProviderDaoAuthenticationProvider

以下可能表明我的经验不足,但这是一个例子,请阅读可能的疯狂 - 试着看看我是否可以注射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和客户端密钥?

2 个答案:

答案 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)
}

默认为纯文本密码编码器。