如何更改 Grails spring-security-ldap:2.0.1 插件以使用自定义的 AuthorityPo



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

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

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

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

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
}

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

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来解决上述问题:

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"
}

现在我可以登录并将嵌套组推断为 Role,但还有一些进一步的问题 - 对于嵌套组中的用户,权限搜索找不到它。

例如,如果我有一个这样的组层次结构树:

Groups -> group02 -> user01
-> group01 (having member group02)
-> group03 -> group04 -> user02

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

我按如下方式玩了配置,但也不起作用:

grails.plugin.springsecurity.ldap.authorities.groupSearchBase = 'ou=Groups,dc=myCompany,dc=com'
grails.plugin.springsecurity.ldap.authorities.searchSubtree = true

请帮忙吗?

如果它产生不同的,则 group01 的 dn 是

cn=group01,ou=Groups,dc=myCompany,dc=com

而 Group04 的 dn 是:

cn=group04,cn=group03,ou=Groups,dc=myCompany,dc=com

啊nvm 我也想出了我的最后一个问题 - 因为现在我正在滚动我自己的 SpringSecurityLdapTemplate 类(搜索实际发生的地方(,'grails.plugin.springsecurity.ldap.authorities.searchSubtree' 配置没有传递给它...... 所以我只是在 search(( 调用之前将此配置直接添加到其中的某个地方,如下所示:

SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);,
...
search(base, formattedFilter, ctls, roleMapper);

它现在按预期工作。

最新更新