如何更改 Grails spring-security-ldap:2.0.1 插件以使用自定义的 AuthoritiesPopulator?
How to change Grails spring-security-ldap:2.0.1 plugin to use customised AuthoritiesPopulator?
我在 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"
}
现在我可以登录并将嵌套组推断为角色,但还有一些问题 - 对于嵌套组中的用户,权限搜索无法找到它。
例如,如果我有这样的组层次结构树:
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 class(搜索实际发生的地方),'grails.plugin.springsecurity.ldap.authorities.searchSubtree' 配置没有被传递下来对它...
所以我只是在调用 search() 之前的某处直接将此配置添加到其中,如下所示:
SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);,
...
search(base, formattedFilter, ctls, roleMapper);
现在一切正常。
我在 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"
}
现在我可以登录并将嵌套组推断为角色,但还有一些问题 - 对于嵌套组中的用户,权限搜索无法找到它。
例如,如果我有这样的组层次结构树:
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 class(搜索实际发生的地方),'grails.plugin.springsecurity.ldap.authorities.searchSubtree' 配置没有被传递下来对它... 所以我只是在调用 search() 之前的某处直接将此配置添加到其中,如下所示:
SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);,
...
search(base, formattedFilter, ctls, roleMapper);
现在一切正常。