《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
?
第九章??LDAP目录服务?
在本章中,我们将会了解轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)以及它怎样集成到使用Spring Security的应用中以提供认证、授权和用户信息服务。
在本章的内容中,我们将会:
?我们从classpath中加载JBCPPets.ldif,并用其为LDAP服务器插入数据。这意味着(如同嵌入式HSQL数据库启动那样)我们应该在WEB-INF/classes放置JBCPPets.ldif文件。root属性用特定的DN声明了LDAP目录的根。这应该与我们使用的LDIF文件逻辑根DN相对应。
?我们稍后将会介绍这些属性——现在,回到应用并运行,使用用户名ldapguest和密码password进行登录。你应该能够登录进去了!
解决嵌入式LDAP的问题
?我们可以看到o.s.s.ldap.authentication.LdapAuthenticator接口定义了一个代理从而允许提供者以自定义的方式认证请求。在这里我们明确配置的是o.s.s.ldap.authentication.BindAuthenticator,它会尝试使用用户的凭证绑定(登录)LDAP服务器,就像用户本身尝试建立连接。对嵌入式的服务器来说,这对于我们的认证要求是足够的,但是,外部的LDAP服务器在用户绑定LDAP目录上可能要求更严格。幸运的是,还有一种替代的认证方式,我们将会在本章稍后介绍。
?我们可以看到,用户在使用LDAP认证之后,LdapAuthenticationProvider委托给了一个LdapAuthoritiesPopulator。DefaultLdapAuthoritiesPopulator将会尝试在LDAP等级中另一个条目的同级或下级属性中查找认证用户的DN。(译者注:即在LDAP目录角色相关的条目中寻找当前用户,以确定用户的角色)
这对于新的开发人员可能会比较抽象和困难,因为这与我们基于JDBC的UserDetailsService实现有很大的区别。让我们以JBCP Pets LDAP目录中的ldapguest用户登录以了解其过程。
用户的DN是uid=ldapguest,ou=Users,dc=jbcppets,dc=com而group-search-base被配置成了ou=Groups。对于这个ou的LDAP树展现如下:
?我们可以看到在ou=Groups之下,有两个条目(cn=Admin和cn=User)。每个条目都具有objectClass:groupOfUniqueNames(你可能会记起我们在本章前面讨论过的对象类)。这种类型的LDAP对象允许多个DN值存储在这个条目下并进行逻辑分组。条目cn=User的属性列在下图中:
?我们可以看到cn=User的uniqueMember属性用来标识这个组里面的LDAP用户。你也可能会发现uniqueMember的属性值就是对应用户的DN。
现在再看角色搜索的逻辑的就很容易了。从ou=Groups(group-search-base)开始,Spring Security将会查找任何uniqueMember属性值与用户DN(group-search-filter)匹配的条目。当它找到匹配的条目,条目的cn值(group-role-attribute)——在本例中即为User,将会加上ROLE_ (role-prefix)前缀然后转换成大写字母组成用户的GrantedAuthority。一旦我们使用过它,再理解起来就容易一些了,不是吗?
【Spring LDAP很灵活。要记住的是尽管这是一个组织LDAP兼容Spring Security的方式,但是通常的使用场景恰恰相反——LDAP目录已经存在,Spring Security需要织入。在很多场景下,你可以重新配置Spring Security来处理LDAP的等级结构。但是,很关键的一点是你要有效规划并理解Spring在查询时如何与LDAP一起工作。开动你的大脑,勾画出用户查找和组查找以及你能想到的最优方案——让查询范围尽可能小和精确。】
如果你此时还是感到困惑,我们建议你休息一下然后尝试使用Apache Directory Studio来看一下运行系统配置的嵌入式LDAP服务器。如果你按照前面描述的算法,尝试自己查找一下目录将会有助于你了解Spring Security LDAP配置的流程。
匹配UserDetails的其它属性
?我们稍后将会看到UserDetailsContextMapper怎样配置才能从标准的LDAP person和inetOrgPerson中获取丰富的信息。使用基本的LdapUserDetailsMapper,仅仅能够存储用户名、密码以及GrantedAuthority。
?