天天看點

Spring Security 學習之LDAP認證

一、前言

LDAP:輕型目錄通路協定,即Lightweight Directory Access Protocol (LDAP)是一個通路線上目錄服務的協定,最典型例子的就是黃頁、電話簿等,主要用于讀極多并且寫極少的場景。

LDAP伺服器:

二、Spring配置

ldap-server:

目标LDAP配置,即協定、IP、端口、使用者名、密碼等,如:

1

<code>&lt;</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>/&gt;</code>

Spring支援内嵌的LDAP測試伺服器配置,ADS有提供相關的jar,内嵌LDAP伺服器隻需要指定root和ldif檔案即可,不需要協定IP端口等配置,ldif檔案可以使用ADS開發工具編輯,如:

<code>&lt;</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>/&gt;</code>

ldap-authentication-provider:

使用者認證授權相關配置,主要是使用者配置使用者組合使用者過濾規則,友善快速從LDAP伺服器定位到使用者資訊,如:

2

3

4

5

6

7

8

9

10

<code>&lt;</code><code>security:authentication-manager</code><code>&gt;</code>

<code>            </code><code>&lt;</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>&gt;</code>

<code>            </code><code>&lt;/</code><code>security:ldap-authentication-provider</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>security:authentication-manager</code><code>&gt;</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>&lt;</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>&gt;</code>

<code>  </code><code>&lt;</code><code>constructor-arg</code> <code>value</code><code>=</code><code>"ldap://monkeymachine:389/dc=springframework,dc=org"</code><code>/&gt;</code>

<code>  </code><code>&lt;</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>/&gt;</code>

<code>  </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"password"</code> <code>value</code><code>=</code><code>"password"</code><code>/&gt;</code>

<code>&lt;/</code><code>bean</code><code>&gt;</code>

<code>&lt;</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>&gt;</code>

<code> </code><code>&lt;</code><code>constructor-arg</code><code>&gt;</code>

<code>   </code><code>&lt;</code><code>bean</code> <code>class</code><code>=</code><code>"org.springframework.security.ldap.authentication.BindAuthenticator"</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>constructor-arg</code> <code>ref</code><code>=</code><code>"contextSource"</code><code>/&gt;</code>

<code>     </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"userDnPatterns"</code><code>&gt;</code>

<code>       </code><code>&lt;</code><code>list</code><code>&gt;&lt;</code><code>value</code><code>&gt;uid={0},ou=people&lt;/</code><code>value</code><code>&gt;&lt;/</code><code>list</code><code>&gt;</code>

<code>     </code><code>&lt;/</code><code>property</code><code>&gt;</code>

<code>   </code><code>&lt;/</code><code>bean</code><code>&gt;</code>

<code> </code><code>&lt;/</code><code>constructor-arg</code><code>&gt;</code>

<code>   </code><code>&lt;</code><code>bean</code>

<code>     </code><code>class</code><code>=</code><code>"org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>constructor-arg</code> <code>value</code><code>=</code><code>"ou=groups"</code><code>/&gt;</code>

<code>     </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"groupRoleAttribute"</code> <code>value</code><code>=</code><code>"ou"</code><code>/&gt;</code>

<code>&lt;</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>&gt;</code>

<code>  </code><code>&lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"0"</code> <code>value</code><code>=</code><code>""</code><code>/&gt;</code>

<code>  </code><code>&lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"1"</code> <code>value</code><code>=</code><code>"(uid={0})"</code><code>/&gt;</code>

<code>  </code><code>&lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"2"</code> <code>ref</code><code>=</code><code>"contextSource"</code> <code>/&gt;</code>

Spring已經提供對LDAP認證的強大支援,一般情況下不需要自己定制。

     本文轉自sarchitect 51CTO部落格,原文連結:http://blog.51cto.com/stevex/1362706,如需轉載請自行聯系原作者

繼續閱讀