【问题标题】:Grails Spring LDAP authentication FailedGrails Spring LDAP身份验证失败
【发布时间】:2014-05-01 03:15:00
【问题描述】:

我正在尝试让 grails spring ldap 工作。无论我尝试什么,我都没有成功通过身份验证。我不确定是什么导致了我的错误。这是我的配置:

  grails.plugin.springsecurity.ldap.context.managerDn = 'cn=root'
grails.plugin.springsecurity.ldap.context.managerPassword = '<value>'
grails.plugin.springsecurity.ldap.context.server = 'ldap://myserver.com:389'
grails.plugin.springsecurity.ldap.authorities.ignorePartialResultException = true
grails.plugin.springsecurity.ldap.search.base ='o=<value>,c=<value'
grails.plugin.springsecurity.ldap.search.filter = 'sAMAccountName={0}'
grails.plugin.springsecurity.ldap.search.searchSubtree = true
 //grails.plugin.springsecurity.password.algorithm = 'SHA-1'
//grails.plugins.springsecurity.ldap.search.derefLink = true
grails.plugin.springsecurity.ldap.auth.hideUserNotFoundExceptions = false
//grails.plugin.springsecurity.ldap.mapper.userDetailsClass = 'person'
//grails.plugin.springsecurity.ldap.search.attributesToReturn = ['cn', 'displayName'] // extra attributes you want returned
grails.plugin.springsecurity.providerNames = ['ldapAuthProvider', 'anonymousAuthenticationProvider']

 // role-specific LDAP config
 //grails.plugin.springsecurity.ldap.useRememberMe = false
//grails.plugin.springsecurity.ldap.authorities.retrieveGroupRoles = true
//grails.plugin.springsecurity.ldap.authorities.retrieveDatabaseRoles = false
//grails.plugin.springsecurity.ldap.authenticator.useBind = true
grails.plugin.springsecurity.ldap.authorities.groupSearchBase='cn=myUser'
grails.plugin.springsecurity.ldap.authorities.groupSearchFilter = 'member={0}'

日志:

2014-04-30 10:24:52,374 [http-bio-8099-exec-8] DEBUG authentication.ProviderManager - Authentication attempt using org.springframework.security.ldap.authentication.LdapAuthenticationProvider 
2014-04-30 10:24:52,418 [http-bio-8099-exec-8] DEBUG authentication.LdapAuthenticationProvider - Processing authentication request for user: cn=<userid> 2014-04-30 10:24:52,418
[http-bio-8099-exec-8] DEBUG search.FilterBasedLdapUserSearch - Searching for user 'cn=   <userid>', with user search [ searchFilter: '(uid={0})', searchBase: 'o=<value>,c=<value>', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ] 
2014-04-30 10:24:52,422 [http-bio-8099-exec-8] DEBUG ldap.SpringSecurityLdapTemplate - Searching for entry under DN '', base = 'o=<value>,c=<value>', filter = '(uid={0})' 
2014-04-30 10:24:52,422 [http-bio-8099-exec-8] DEBUG rememberme.TokenBasedRememberMeServices - Interactive login attempt was unsuccessful.
2014-04-30 10:24:52,423 [http-bio-8099-exec-8] DEBUG rememberme.TokenBasedRememberMeServices - Cancelling cookie 2014-04-30 10:24:52,423 
[http-bio-8099-exec-8] DEBUG web.DefaultRedirectStrategy - Redirecting to '/LDAPTest1/login/authfail?login_error=1'

请指教

Java 代码: `

public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
    public static String MY_HOST = "ldap://myserver:389";
    public static String MY_SEARCHBASE = "o=<value>,c=<value>";
    public static String MY_FILTER = "cn=<userid>";
    public static String MGR_DN = "cn=root";
    public static String MGR_PW = "<pwd>";

Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY,INITCTX);
            env.put(Context.PROVIDER_URL,MY_HOST);
            env.put(Context.SECURITY_AUTHENTICATION,"simple");
            env.put(Context.SECURITY_PRINCIPAL,MGR_DN);
            env.put(Context.SECURITY_CREDENTIALS,MGR_PW);
            DirContext ctx = new InitialDirContext(env);
            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
//performs the actual search  
//We give it a searchbase, a filter and the contraints containing the scope  
//of the search  
            NamingEnumeration results = ctx.search(MY_SEARCHBASE,MY_FILTER,constraints);

`

【问题讨论】:

  • 您管理 LDAP 还是由其他人管理?你能检查一下日志吗?我知道我们的设置确实有 managerDN='CN=Valu1,OU=Value2,DC=Value3,DC=value4'
  • 我不管理 LDAP。但是我们的 LDAP 使用传统的层次结构,从 root 开始,然后是 c=,然后是 o=value,然后是 cn
  • 你能问管理它的组/人该字段应该是什么吗?
  • 这就是问题所在..我们没有任何人管理它..我们所拥有的只是使用 LDAP 来进行身份验证的现有 Java 应用程序。使用 Java,它可以工作。为什么不使用 grails?我使用了相同的使用初始上下文搜索时的搜索过滤器和搜索库。
  • 您是否有建立连接的 java 源代码/配置文件?这是在春天发生的还是习惯性的?

标签: grails spring-ldap


【解决方案1】:

所以,another user had a similar problem

看起来他改变的主要价值观也与你的不同

grails.plugins.springsecurity.conf.ldap.authorities.retrieveGroupRoles = false

另外,您的 groupSearchBase 应该是组,而不是特定用户。所以不是

grails.plugin.springsecurity.ldap.authorities.groupSearchBase='cn=myUser'

应该更像

grails.plugins.springsecurity.ldap.authorities.groupSearchBase ='DC=Group,DC=com'

您在工作 Java 代码中使用的搜索过滤器似乎与您在 grails 配置中使用的搜索过滤器不同。您的 java 代码有一个过滤器 "cn=&lt;userid&gt;",但您的 Grails 配置使用了“sAMAccountName={0}”。我认为 sAMAccountName 是 Microsoft Active Directory 系统的首选,但您的 LDAP 服务器可能不同。

最后一件事要检查:您还需要为 Spring Security Core 配置一些东西。这是来自上述链接的示例:

// Added by the Spring Security Core plugin:
grails.plugins.springsecurity.userLookup.userDomainClassName = 'org.example.SecUser'
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'org.example.SecUserSecRole'
grails.plugins.springsecurity.authority.className = 'org.example.SecRole'

如果您不太确定要为这些设置使用哪些值,请查看 Spring Security 插件文档。您需要设置一些必需的域类。 http://grails-plugins.github.io/grails-spring-security-core/docs/manual/

【讨论】:

  • 感谢@jonnybot ..那么在这种情况下,我的搜索过滤器应该是 cn={0} 吗?
  • 我认为是这样,但 ldap 查询字符串对我来说仍然几乎是黑魔法。不过,这似乎是正确的。
  • 是的,即使我不明白...我尝试给 cn={0}.. 也不起作用。我正在使用使用 SHA 加密密码的 LDAP 服务器。我不确定如果我必须通过算法。LDAP中的密码以{SHA}开头。我尝试了所有可能的组合。它似乎不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 2020-04-14
  • 2015-04-19
  • 2016-02-05
  • 1970-01-01
  • 2013-11-13
  • 2011-05-25
相关资源
最近更新 更多