用于身份验证的 Grails Spring Security X509 和用于权限的 LDAP

Posted

技术标签:

【中文标题】用于身份验证的 Grails Spring Security X509 和用于权限的 LDAP【英文标题】:Grails Spring Security X509 for Authentication and LDAP for Authorities 【发布时间】:2014-05-06 19:29:48 【问题描述】:

这里需要一些指针。

我正在尝试让 X509 和 LDAP 在我的应用程序中工作。我希望用户使用他们的 PKI 证书进行身份验证,然后让 APP 从我们的 LDAP 服务器获取他们的权限。

我目前有 LDAP 与客户 userDetailsContextMapper 合作,但是如何正确添加 x509 让我有点难过。

我想我想要的是一个使用注入的 ldapUserDetails 服务的 PreAuthenticatedAuthenticationProvider。

我该怎么做?我是否需要 UserDetailsByNameServiceWrapper 来包装 LdapUserDetailsS​​ervice 以在预身份验证提供程序中使用?

我之所以问是因为不幸的是,目前的测试平台和开发环境是分离的,而且我没有设置本地 LDAP 或 PKI 来进行测试,所以它大约需要 6 小时的过程才能对开发环境产生新的战争...限制性我知道...所以我想第一次做对。

干杯!

【问题讨论】:

【参考方案1】:

注意:以下适用于 Spring-Security-Core v1.2.7.3,配置名称在 2.0RC2 中有所不同

根据几个不同的想法,这就是我想出的。这假设您已经使用自定义的 LDAP 和 UserDetailsContextMapper(请参阅:ldap documentation):

确保LDAPPreAuthenticatedAuthentication 提供程序都在提供程序列表中:

grails.plugins.springsecurity.providerNames = [
                                       'preAuthenticatedAutehnticationProvider',
                                       'ldapAuthProvider',
                                       'daoAutehnticationProvider',
                                       'anonymousAuthenticationProvider', 
                                       'rememberMeAuthenticationProvider']

然后在你的 spring 资源 (grails-app/conf/spring/resources.groovy) 中配置以下 bean:

ldapUserDetailsService(org.springframework.security.ldap.userdetails.LdapUserDetailsService, 
                       ref('ldapUserSearch'),
                       ref('ldapAuthoritiesPopulator')) 
    userDetailsMapper = ref('ldapUserDetailsMapper')


userDetailsByNameServiceWrapper(org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper) 
    userDetailsService = ref('ldapUserDetailsService')


preAuthenticatedAuthenticationProvider(org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider) 
    preAuthenticatedUserDetailsService = ref('userDetailsByNameServiceWrapper')

还有鲍勃你的叔叔,你还有一些阿姨!

作为参考,我曾经提出此解决方案的页面是:

    No AuthenticationProvider found using spring security

    将您的 LdapUserDetailsS​​ervice 包装在 UserDetailsByNameServiceWrapper 中 代替 LdapAuthenticationProvider 配置 PreAuthenticatedAuthenticationProvider 将能够处理您的 CustomX509AuthenticationFilter 发出的 PreAuthenticatedAuthenticationToken。 将封装好的 LdapUserDetailsS​​ervice 注入 PreAuthenticatedAuthenticationProvider。

    http://blog.serindu.com/2011/05/26/grails-spring-security-using-preauthenticated-authentication-provider/ 介绍如何在 grails 中连接 preAuthenticationAuthenticationProvider

    http://forum.spring.io/forum/spring-projects/security/108467-combine-pre-authentication-with-ldap-for-user-details-and-authorities

    有一个 LdapUserDetailsS​​ervice 可以完成 LdapAuthenticationProvider 所做的所有好事 - 除了身份验证

    http://pwu-developer.blogspot.co.uk/2012/02/grails-security-with-cas-and-ldap.html 详细了解如何连接 ldapUserDetailsS​​ervice

希望这对其他人有帮助!

【讨论】:

以上是关于用于身份验证的 Grails Spring Security X509 和用于权限的 LDAP的主要内容,如果未能解决你的问题,请参考以下文章

Grails Spring Security 验证多个 url 的访问

Grails - Spring 安全 ldap 活动目录身份验证 - 凭据错误错误

如何为每个 url 配置 grails/spring 身份验证方案?

Grails 通过 Spring Security 插件使用 Google 身份验证

Grails Spring 安全插件 AJAX 身份验证

来自服务的 Grails Spring Security 身份验证