首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改Grails spring-security-ldap:2.0.1插件以使用定制的AuthoritiesPopulator?

如何更改Grails spring-security-ldap:2.0.1插件以使用定制的AuthoritiesPopulator?
EN

Stack Overflow用户
提问于 2018-07-06 17:13:17
回答 0查看 201关注 0票数 1

我使用的是Grails 2.4.4,使用插件spring-security-core:2.0.0和spring-security-ldap:2.0.1。来自OpenLdap的LDAP服务。

上面的方法是有效的,我可以从组user是的成员中推断出用户ROLE_。

但是我们有一个需求变化,现在我们需要从嵌套的LDAP组树推断用户角色。

我检查了一下,spring-security-ldap:2.0.1是基于springsecurity 3.2.9的,它还没有包含NestedLdapAuthoritiesPopulator,所以我去github获取了它和其他几个依赖类,把它们放进去,并修改了我的resources.groovy以使用它,如下所示:

代码语言:javascript
复制
beans = {
ldapAuthProvider(org.springframework.security.ldap.authentication.LdapAuthenticationProvider,
            ref("ldapAuthenticator"), // Use default
            ref("myLdapAuthoritiesPopulator") // Use custom
    ) {}

    myLdapAuthoritiesPopulator(com.ldap.NestedLdapAuthoritiesPopulator, ref("contextSource2"), application.config.grails.plugin.springsecurity.ldap.authorities.groupSearchBase ) {}

    // Set up the manager to read LDAP
    contextSource2(DefaultSpringSecurityContextSource, application.config.grails.plugin.springsecurity.ldap.context.server) {       
        userDn = application.config.grails.plugin.springsecurity.ldap.context.managerDn ?:null 
        password = application.config.grails.plugin.springsecurity.ldap.context.managerPassword ?:null
    }

但一旦我尝试了一下,我就遇到了这样的错误:

代码语言:javascript
复制
Message: [LDAP: error code 49 - Invalid Credentials]; nested exception is javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials]
    Line | Method
->>  257 | searchForMultipleAttributeValues in com.ldap.SpringSecurityLdapTemplate$$EQx0bs0G
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    200 | performNestedSearch              in com.ldap.NestedLdapAuthoritiesPopulator
|    160 | getGroupMembershipRoles . . . .  in     ''
|    213 | getGrantedAuthorities            in com.ldap.DefaultLdapAuthoritiesPopulator$$EQx0Xl3o
|     59 | attemptAuthentication . . . . .  in grails.plugin.springsecurity.web.authentication.GrailsUsernamePasswordAuthenticationFilter
|     62 | doFilter                         in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|     59 | doFilter . . . . . . . . . . . . in grails.plugin.springsecurity.web.SecurityRequestHolderFilter
|   1145 | runWorker                        in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . . . . . . . . . . . .  in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run                              in java.lang.Thread
Caused by AuthenticationException: [LDAP: error code 49 - Invalid Credentials]

我遗漏了什么吗?或者,有没有更好的方法来实现我想要做的事情?

编辑20180711

我通过在resources.goovy中添加contextSource2来解决上述问题:

代码语言:javascript
复制
    contextSource2(DefaultSpringSecurityContextSource, application.config.grails.plugin.springsecurity.ldap.context.server) {
        userDn = application.config.grails.plugin.springsecurity.ldap.context.managerDn ?:null
        password = application.config.grails.plugin.springsecurity.ldap.context.managerPassword ?:null
        authenticationSource = ref('ldapAuthenticationSource')
        authenticationStrategy = ref('authenticationStrategy')
        anonymousReadOnly = true 
}

ldapAuthenticationSource(SimpleAuthenticationSource) {
    principal = "uid=admin,dc=myCompany,dc=com"
    credentials = "Admin123"
}
authenticationStrategy(GrailsSimpleDirContextAuthenticationStrategy) {
    userDn = "uid=admin,dc=myCompany,dc=com"
}

现在我可以登录并推断嵌套组为角色,但有一些进一步的问题-对于嵌套组中的用户,无法通过权威搜索找到它。

例如,我有一个组层次结构树,如下所示:

代码语言:javascript
复制
Groups -> group02 -> user01
       -> group01 (having member group02)
       -> group03 -> group04 -> user02

如果以user01身份登录,则角色推断为ROLE_GROUP01和ROLE_GROUP02。但是如果以user02身份登录,则根本不会返回任何角色。

我尝试了下面的配置,但也不起作用:

代码语言:javascript
复制
grails.plugin.springsecurity.ldap.authorities.groupSearchBase = 'ou=Groups,dc=myCompany,dc=com'
grails.plugin.springsecurity.ldap.authorities.searchSubtree = true

有什么需要帮忙的吗?

如果它生成一个不同的值,则group01的dn为

代码语言:javascript
复制
cn=group01,ou=Groups,dc=myCompany,dc=com

而group04的dn是:

代码语言:javascript
复制
cn=group04,cn=group03,ou=Groups,dc=myCompany,dc=com
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51206911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档