一、前言
LDAP:轻型目录访问协议,即Lightweight Directory Access Protocol (LDAP)是一个访问在线目录服务的协议,最典型例子的就是黄页、电话簿等,主要用于读极多并且写极少的场景。
LDAP服务器:
二、Spring配置
ldap-server:
目标LDAP配置,即协议、IP、端口、用户名、密码等,如:
1
<code><</code><code>security:ldap-server</code> <code>url</code><code>=</code><code>"ldap://localhost:10389/o=apple"</code> <code>manager-dn</code><code>=</code><code>"uid=admin,ou=system"</code> <code>manager-password</code><code>=</code><code>"secret"</code> <code>/></code>
Spring支持内嵌的LDAP测试服务器配置,ADS有提供相关的jar,内嵌LDAP服务器只需要指定root和ldif文件即可,不需要协议IP端口等配置,ldif文件可以使用ADS开发工具编辑,如:
<code><</code><code>security:ldap-server</code> <code>root</code><code>=</code><code>"o=apple"</code> <code>ldif</code><code>=</code><code>"classpath:apple.ldif"</code><code>/></code>
ldap-authentication-provider:
用户认证授权相关配置,主要是用户配置用户组合用户过滤规则,方便快速从LDAP服务器定位到用户信息,如:
2
3
4
5
6
7
8
9
10
<code><</code><code>security:authentication-manager</code><code>></code>
<code> </code><code><</code><code>security:ldap-authentication-provider</code>
<code> </code><code>user-search-filter</code><code>=</code><code>"(uid={0})"</code>
<code> </code><code>user-search-base</code><code>=</code><code>"ou=users"</code>
<code> </code><code>group-search-filter</code><code>=</code><code>"(uniqueMember={0})"</code>
<code> </code><code>group-search-base</code><code>=</code><code>"ou=groups"</code>
<code> </code><code>group-role-attribute</code><code>=</code><code>"cn"</code>
<code> </code><code>role-prefix</code><code>=</code><code>"ROLE_"</code><code>></code>
<code> </code><code></</code><code>security:ldap-authentication-provider</code><code>></code>
<code> </code><code></</code><code>security:authentication-manager</code><code>></code>
<a href="http://s3.51cto.com/wyfs02/M00/12/91/wKioL1MK57KiW7jkAADS-65MRbs628.jpg" target="_blank"></a>
user-dn-pattern: 用户dn过滤规则,如user-dn-pattern="uid={0},ou=people", uid={0}表示过滤uid属性
user-search-base: 指定从哪个分支开始查找用户,如user-search-base="ou=people",默认从root开始
user-search-filter: 用户过滤规则,如user-search-filter="(uid={0})" ,与user-dn-pattern类似,使用一个即可
group-search-base: 指定从哪个分支开始查找用户用户组,如group-search-base="ou=groups"
group-search-filter: 用户组过滤规则,如group-search-filter="(uniqueMember={0})"表示使用uniqueMember属性过滤
group-role-attribute: 用户组中Role映射属性,默认为cn,验证时会自动增加role前缀
role-prefix : role前缀, 默认为"ROLE_",即role-prefix="ROLE_"
通过以上基本的配置即可支持LDAP认证授权。
三、高级配置
Spring强大的功能之一就是在提供简便配置的同时支持自己定制,而定制最基础的就是bean配置,通过替换bean的实现可以替换掉spring原先提供的默认实现。
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"contextSource"</code>
<code> </code><code>class</code><code>=</code><code>"org.springframework.security.ldap.DefaultSpringSecurityContextSource"</code><code>></code>
<code> </code><code><</code><code>constructor-arg</code> <code>value</code><code>=</code><code>"ldap://monkeymachine:389/dc=springframework,dc=org"</code><code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"userDn"</code> <code>value</code><code>=</code><code>"cn=manager,dc=springframework,dc=org"</code><code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"password"</code> <code>value</code><code>=</code><code>"password"</code><code>/></code>
<code></</code><code>bean</code><code>></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"ldapAuthProvider"</code>
<code> </code><code>class</code><code>=</code><code>"org.springframework.security.ldap.authentication.LdapAuthenticationProvider"</code><code>></code>
<code> </code><code><</code><code>constructor-arg</code><code>></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"org.springframework.security.ldap.authentication.BindAuthenticator"</code><code>></code>
<code> </code><code><</code><code>constructor-arg</code> <code>ref</code><code>=</code><code>"contextSource"</code><code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"userDnPatterns"</code><code>></code>
<code> </code><code><</code><code>list</code><code>><</code><code>value</code><code>>uid={0},ou=people</</code><code>value</code><code>></</code><code>list</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
<code> </code><code></</code><code>bean</code><code>></code>
<code> </code><code></</code><code>constructor-arg</code><code>></code>
<code> </code><code><</code><code>bean</code>
<code> </code><code>class</code><code>=</code><code>"org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"</code><code>></code>
<code> </code><code><</code><code>constructor-arg</code> <code>value</code><code>=</code><code>"ou=groups"</code><code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"groupRoleAttribute"</code> <code>value</code><code>=</code><code>"ou"</code><code>/></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"userSearch"</code>
<code> </code><code>class</code><code>=</code><code>"org.springframework.security.ldap.search.FilterBasedLdapUserSearch"</code><code>></code>
<code> </code><code><</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"0"</code> <code>value</code><code>=</code><code>""</code><code>/></code>
<code> </code><code><</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"1"</code> <code>value</code><code>=</code><code>"(uid={0})"</code><code>/></code>
<code> </code><code><</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"2"</code> <code>ref</code><code>=</code><code>"contextSource"</code> <code>/></code>
Spring已经提供对LDAP认证的强大支持,一般情况下不需要自己定制。
本文转自sarchitect 51CTO博客,原文链接:http://blog.51cto.com/stevex/1362706,如需转载请自行联系原作者