当前位置: 首页 > 知识库问答 >
问题:

如何更改GrailsSpring Securityldap:2.0.1插件以使用定制的AuthoritiesPopulator?

龚威
2023-03-14

我在圣杯2.4.4上使用插件Spring安全核心:2.0.0

上面的工作正常,我可以从用户所属的组推断出用户ROLE_。

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

我查了一下,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]

我通过在资源.goovy中添加上下文源2来解决上述问题:

    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_CROUP02。但如果以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

和组04的 dn 是:

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

共有1个答案

祁俊拔
2023-03-14

啊nvm我也想出了我的最后一个问题——因为现在我正在滚动我自己的SpringSecurityLdapTemplate类(搜索实际发生的地方),‘grails . plugin . spring security . LDAP . authorities . search subtree’配置没有传递给它...所以我只是在search()调用之前将这个配置直接添加到它的某个地方,就像这样:

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

现在它正在按预期工作。

 类似资料:
  • 在grails progect中,我想构建一个二进制插件,在每个特定的项目上都可以实现“钩子” 二进制插件结构 THX 法比奥

  • 该插件添加了有关选择更改的其他信息。一旦包含在plugins配置选项, 每个changed.jstree事件数据将包含一个名为的新属性changed,该属性将提供有关自上一个事件以来的selected 和 deselected节点的信息。changed.jstree $(function () { $("#plugins") .on("changed.jstree", functi

  • 问题内容: 如何聆听角度分量绑定更改并执行操作? 现在,当我要更改时要使用此值执行其他操作时,该 怎么办? 问题答案: 现在,当项目更改时,我想使用此值执行其他操作,该怎么办? 但我想避免使用濒死的$ scope 如果你 不 希望使用,你可以使用属性 设置器 检测到任何变化如: 请注意,您不应将其用于复杂的逻辑(原因: https //basarat.gitbooks.io/typescript/

  • 我正在编写Webpack插件,我需要执行相同的技巧,以便在应用程序之前注入。 它将包的入口点更改为某个自定义函数,该函数需要,然后加载原始入口应用程序。 包中的片段 我找不到做这件事的代码,有什么指示吗?

  • 问题内容: 我有这样的选项菜单: 现在,我想使用href更改选定的选项。例如: 但是我想用而不是选择选项。 如何更改此代码? 问题答案: 更改 至

  • 问题内容: 我的网页中有这个标签控件 当页面呈现时,控件的id会变成这样 我怎样才能阻止asp.net更改ID以执行这样的jQuery操作 问题答案: 而不是使用此选择器 使用这一代码,基本上您正在使用经典的ASP内联服务器端代码。 这将插入生成的任何ID作为文字放置。 如果您希望使用外部文件,则建议您在页面上创建一个全局obj,以保存所有客户端ID,然后在外部文件中引用该obj(不理想,但这是一