在我们指定 authenticator 构造参数时,我们指定了一个 BindAuthenticator 对象,并将一个 contextSource 指定给了它,这个 contextSource 的定义如下:
<bean id="contextSource"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource" >
<constructor-arg value="${security.ldap.providerUrl}" />
<property name="userDn" value="${security.ldap.userDn}" />
<property name="password" value="${security.ldap.password}" />
</bean>
这里定义了 LDAP 的一些属性。userDn 和 password 是一个域账户的用户名和密码,我们公司配置的 LDAP 必须要指定一个有特殊权限的用户来操作才可以。
${security.ldap.searchFilter} 是配置文件中配置的 LDAP 查询用户的过滤器内容,像我们公司的 LDAP服务器,登录是检查 mailNickname 来作为用户名的,所以我们在配置文件中如下配置:{0} 会替换成登录用户输入的用户名。
security.ldap.searchFilter=(mailNickname={0})
在我们指定 ldapAuthProvider 的第二个构造参数 authoritiesPopulator 时,我们配置的是自己实现的类 LdapAuthoritiesPopulatorImpl,这个类首选检查里有没有记录,如果没有,就用LDAP里的信息初始化。然后从加载权限并添加到要作为函数返回值的Collection 中去。
这里需要注意的是,如果我们希望拿到 LDAP 里的信息,不需要自己再写程序连接 LDAP服务器,因为传入的参数 DirContextOperations userData 已经将能读到的 LDAP 信息都带过来了。比如你想要用户的中文姓名,那么可以这样:
userData.getAttributes().get("displayName").get().toString()
当然,上面说的 displayName 是我们公司 LDAP 里记录中文姓名的属性。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33983-4.html
为什么马云这么爱说啊
我们趁这个机会宣布南海防空识别区了