为了安全目的,LDAP 经常被用来帮助集中的用户名和密码认证——用户的凭证存储在LDAP目录中,而对于用户来说,认证请求基于目录进行。这对于管理员来说可以便于管理,因为用户的凭证——登录、密码和其它信息——都存储在 LDAP 中的一个地址。另外,组织机构信息,如组和团队的分配、地理位置以及组织的等级结构,也定义在用户在目录中的位置上。
常用的LDAP术语:
entry是LDAP中一个基本的存储单元;可以被看作是一个DN和一组属性的集合.
dn(distinguished name):是LDAP记录项的名字.在LDAP目录中的所有记录项都有一个唯一的dn。每一个LDAP记录项的DN是由两个部分组成的:相对DN(RDN)和记录在LDAP目录中的位置
objectClass根据不同的objectClass,我们可以判断这个entry是否属于某一个类型.比如我们需要找出LDAP中的全部用户:(objectclass=person)再比如我们需要查询全部的LDAP组:(objectclass=groupOfUniqueNames)
dc(domain component):域组件,一般作为LDAP等级结构中的最高级组织.
c(country):一些LDAP等级结构中将国家作为很高的等级.
o(organization name)一个LDAP资源分类上的业务组织
ou(organizational unit)
cn(common name)通用名.
uid(user id)
userPassword
一.运行一个嵌入式的 LDAP服务
1.配置 LDAP服务器引用
<ldap-server id="ldapServer" ldif="classpath:/ldif/calendar.ldif" root="dc=jbcpcalendar,dc=com"/>
2.启用LDAP AuthenticationProvider
<authentication-manager>
<ldap-authentication-provider server-ref="ldapServer" user-search-filter="(uid={0})" group-search-base="ou=Groups"/>
</authentication-manager>
3.启动jetty测试吧.
理解Spring LDAP认证如何工作,在LDAP 认证过程中有三个基本的步骤:
a.将用户提供的凭证与LDAP 目录进行认证;
b.基于LDAP 上的信息,确定用户拥有的GrantedAuthority;
c.为了应用以后用到,从LDAP 条目中预先加载用户信息到自定义的 UserDetails对象中。
第一步,认证用户凭证:自定义身份验证提供程序注入到AuthenticationManager.o.s.s.ldap.authentication.LdapAuthenticationProvider拿到用户提供的凭据并与LDAP目录进行验证.如下图所示:
o.s.s.ldap.authentication.LdapAuthenticator定义了一个代理从而允许提供者以自定义的方式认证请求.这里使用o.s.s.ldap.authentication.BindAuthenticator,它会尝试使用用户的凭证绑定(登录)LDAP服务器,就像用户本身尝试建立连接.
第二步,确定用户的角色:经过第一步的服务器成功认证之后,接下来就会进行权限信息的确定.授权是通过安全实体的一系列角色定义的,,LDAP认证过的用户角色确定,如下图所示
LdapAuthenticationProvider委托给LdapAuthoritiesPopulator.DefaultLdapAuthoritiesPopulator在 LDAP目录角色相关的条目中寻找当前用户,以确定用户的角色.
通过group-search-base属性定义查找用户角色分配的DN.此例设置了group-search-base="ou=Groups",当一个用户的DN在 group-search-base DN下面的条目中时包含用户 DN的条目中的一个属性将会作为这些用户的角色.
DefaultLdapAuthoritiesPopulator使用了几个<ldap-authentication-provider>声明的属性来管理为用户查找角色。这些属性大致按以下的顺序使用:
group-search-base:它定义了基础的DN,LDAP集成应该基于此往下为用户查找一个或多个的匹配项。默认值会在LDAP根中进行查找,这可能会代价较高;
group-search-filter:它定义了 LDAP 查找的过滤器,用来匹配用户的 DN 与group-search-base 之下的条目属性。这个过滤器通过两个参数进行参数化设置——第一个({0})作为用户的 DN,第二个作为({1})作为用户的名字。默认值为(uniqueMember={0})。
group-role-attribute:它定义了匹配条目中用来组装用户 GrantedAuthority 的属性,默认值为cn;
role-prefix:要拼到在 group-role-attribute 中发现值的前缀以产生 Spring Security 的GrantedAuthority。默认值为ROLE_。
chapter5剩下的内容先留着...