2014-02-28 116 views
5

这里是我的Perl CGI脚本的一部分(这是工作..):配置Grails的Spring Security的LDAP插件


use Net::LDAP; 
use Net::LDAP::Entry; 
... 
$edn = "DC=xyz,DC=com"; 
$quser ="(&(objectClass=user)(cn=$username))"; 
$ad = Net::LDAP->new("ip_address..."); 
$ldap_msg=$ad->bind("$username\@xyz.com", password=>$password); 

my $result = $ad->search(  base=>$edn, 
          scope=>"sub", 
          filter=>$quser); 
my $entry; 
my $myname; 
my $emailad; 
my @entries = $result->entries; 

foreach $entry (@entries) { 
$myname = $entry->get_value("givenName"); 
$emailad = $entry->get_value("mail"); 
} 

所以基本上不存在用于管理员/管理员帐户AD,用户凭证用于绑定。我需要在grails中实现同样的事情。 +有没有一种方法来配置插件来搜索几个AD,我知道我可以在context.server中添加更多的ldap IP,但是对于每个服务器我需要一个不同的搜索基础..

++我不想用我的DB,只是AD。通过LDAP用户登录>我收到他的电子邮件,并使用电子邮件的其他LDAP查询但这可能会是另外一个话题:)

反正到目前为止的代码是:

grails.plugin.springsecurity.ldap.context.managerDn = '' 
grails.plugin.springsecurity.ldap.context.managerPassword = '' 
grails.plugin.springsecurity.ldap.context.server = 'ldap://address:389' 
grails.plugin.springsecurity.ldap.authorities.ignorePartialResultException = true 
grails.plugin.springsecurity.ldap.search.base = 'DC=xyz,DC=com' 
grails.plugin.springsecurity.ldap.authenticator.useBind=true 
grails.plugin.springsecurity.ldap.authorities.retrieveDatabaseRoles = false 
grails.plugin.springsecurity.ldap.search.filter="sAMAccountName={0}" 
grails.plugin.springsecurity.ldap.search.searchSubtree = true 
grails.plugin.springsecurity.ldap.auth.hideUserNotFoundExceptions = false 
grails.plugin.springsecurity.ldap.search.attributesToReturn = 
      ['mail', 'givenName'] 
grails.plugin.springsecurity.providerNames= 
      ['ldapAuthProvider',anonymousAuthenticationProvider'] 


grails.plugin.springsecurity.ldap.useRememberMe = false 
grails.plugin.springsecurity.ldap.authorities.retrieveGroupRoles = false 
grails.plugin.springsecurity.ldap.authorities.groupSearchBase ='DC=xyz,DC=com' 
grails.plugin.springsecurity.ldap.authorities.groupSearchFilter = 'member={0}' 

和错误代码:[LDAP:错误代码1 - 000004DC:LdapErr:DSID-0C0906E8,注释:为了执行此操作,必须在连接上成功完成绑定。数据0,v1db1

而且它与任何用户/通行证我尝试:/ Heeeeelp! :)

+0

存在丢失的引号和左括号您providerNames名单上。不知道这是否会起作用。 – grantmcconnaughey

+0

对不起,复制时出错,行是:grails.plugin.springsecurity.providerNames = ['ldapAuthProvider','anonymousAuthenticationProvider'] – user1611228

回答

2

Grails和AD最重要的事情是使用ActiveDirectoryLdapAuthenticationProvider而不是LdapAuthenticationProvider,因为它可以节省一个痛苦的世界。要做到这一点,只需做如下修改:

在resources.groovy:

// Domain 1 
ldapAuthProvider1(ActiveDirectoryLdapAuthenticationProvider, 
     "mydomain.com", 
     "ldap://mydomain.com/" 
) 

// Domain 2 
ldapAuthProvider2(ActiveDirectoryLdapAuthenticationProvider, 
     "mydomain2.com", 
     "ldap://mydomain2.com/" 
) 

Config.groovy中:

grails.plugin.springsecurity.providerNames = ['ldapAuthProvider1', 'ldapAuthProvider2'] 

这是所有你需要的代码。您几乎可以删除Config.groovy中的所有其他grails.plugin.springsecurity.ldap。*设置,因为它们不适用于此AD设置。

文档: http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ldap-active-directory

相关问题