Symfony提供了不同的方法來配合LDAP服務器使用。
Security組件提供:
ldap user provider,使用的是
form_login_ldap authentication provider,用于針對一臺使用了表單登錄的LDAP服務器。同所有其他user provider一樣,它可以同任何authentication provider一起使用。
http_basic_ldap authentication provider,用于針對一臺使用了HTTP Basic的LDAP服務器。同所有其他user provider一樣,它可以同任何authentication provider一起使用。
這意味著在以下場合是可以工作的:
利用一臺LDAP服務器來比對用戶密碼并取出用戶信息。這可以使用LDAP user provider,以及LDAP form login或LDAP HTTP basic兩個authentication provider中的一種來完成。
利用一臺LDAP服務器來比對用戶密碼,但從另一個資源處取得用戶信息(比如,一個使用了FOSUserBundle的數據庫)。
從一臺LDAP服務器取出用戶信息,同時使用另一種用戶驗證策略(比如,基于token的預驗證)。
LDAP配置參考??
完整的LDAP配置參考 (form_login_ldap, http_basic_ldap, ldap) 請見 SecurityBundle Configuration ("security")。其中一些更有意思的選項在此進行解釋。
配置LDAP客戶端??
所有架構都需要LDAP客戶端被預先配置好。providers被配置為使用一個名為 ldap 的服務,但你也可以在security組件的配置信息中覆寫此項設置。
使用下列配置,一個LDAP客戶端可以被簡單地配置:
1
2
3
4
5
6
7
8
9
10# app/config/services.ymlservices:ldap:class:Symfony\Component\Ldap\LdapClientarguments: - my-server # host
- 389 # port
- 3 # version
- false # SSL
- true # TLS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
my-server
389
3
false
true
1
2
3
4
5
6
7
8
9
10
11
12
13// app/config/services.php
use Symfony\Component\Ldap\LdapClient;
use Symfony\Component\DependencyInjection\Definition;
$container
->setDefinition('ldap', new Definition(LdapClient::class, array(
'my-server',
389,
3,
false,
true,
));
利用LDAP User Provider取出用戶??
如果你想從一臺LDAP服務器中取出用戶信息,你就需要使用 ldap user provider了:
1
2
3
4
5
6
7
8
9
10
11
12
13# app/config/security.ymlsecurity: # ...
providers:my_ldap:ldap:service:ldapbase_dn:dc=example,dc=comsearch_dn:"cn=read-only-admin,dc=example,dc=com"search_password:passworddefault_roles:ROLE_USERuid_key:uid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">
service="ldap"
base-dn="dc=example,dc=com"
search-dn="cn=read-only-admin,dc=example,dc=com"
search-password="password"
default-roles="ROLE_USER"
uid-key="uid"
/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14$container->loadFromExtension('security', array(
'providers' => array(
'ldap_users' => array(
'ldap' => array(
'service' => 'ldap',
'base_dn' => 'dc=example,dc=com',
'search_dn' => 'cn=read-only-admin,dc=example,dc=com',
'search_password' => 'password',
'default_roles' => 'ROLE_USER',
'uid_key' => 'uid',
),
),
),
);
ldap user provider支持多種不同的配置選項:
service??
值類型: string 默認值: ldap
這是你所配置的LDAP客戶端的名字。你可以隨便選擇名稱,但必須是程序中的唯一,并且不允許以數字或空格開頭。
base_dn??
值類型: string 默認值: null
這是目錄的base DN。
search_dn??
值類型: string 默認值: null
這是你的只讀用戶的DN,用于對LDAP服務器進行認證,以便取出用戶信息。
search_password??
值類型: string 默認值: null
這是你的只讀用戶的密碼,用于對LDAP服務器進行認證,以便取出用戶信息。
default_roles??
值類型: array 默認值: []
這是你希望分配給“從LDAP服務器取出的用戶”之默認role。如果你不配置此鍵,用戶不會有任何role,并不被當作“完全認證”(fully authenticated)的用戶。
uid_key??
值類型: string 默認值: sAMAccountName
這是入口點(entry)的key,用作其uid。取決于你的LDAP服務器之具體落實(implementation)。常用值是:
sAMAccountName
userPrincipalName
uid
filter??
值類型: string 默認值: ({uid_key}={username})
這個鍵讓你配置哪個LDAP查詢將被使用。{uid_key} 字符串將被 uid_key 配置值所替換 (默認時, sAMAccountName) 和 {username} 字符串將被你“正在嘗試加載的用戶名”給替換。
例如,帶有一個 uid 值的 uid_key,如果你嘗試加載 fabpot 用戶,最終的字符串將會是: (uid=fabpot)。
當然,用戶名會被轉義,為的是防止 LDAP injection。
filter 選項鍵的語法被 RFC4515 所定義。
針對LDAP服務器進行身份認證??
針對LDAP服務器進行身份認證,可以藉由使用form login或是HTTP Basic兩個authentication providers來完成。
除了兩個選項鍵之外,它們和“非LDAP”情況下的配置完全一樣:
service??
值類型: string 默認值: ldap
這是你所配置的LDAP客戶端的名字。你可以隨便選擇名稱,但必須是程序中的唯一,并且不允許以數字或空格開頭。
dn_string??
值類型: string 默認值: {username}
這個鍵定義了“用于從用戶名中組成用戶的DN的字符串”的格式。{username} 字符串將被正在認證的人的真實用戶名所替換。
例如,如果你的用戶擁有 uid=einstein,dc=example,dc=com 這樣一個DN字符串,那么 dn_string 將會是 uid={username},dc=example,dc=com。
下面給出了 form_login_ldap 和 http_basic_ldap 的配置示例。
表單登陸之配置示例??
1
2
3
4
5
6
7
8
9
10
11
12
13# app/config/security.ymlsecurity: # ...
firewalls:main: # ...form_login_ldap:login_path:logincheck_path:login_check
# ...service:ldapdn_string:'uid={username},dc=example,dc=com'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">
login-path="login"
check-path="login_check"
service="ldap"
dn-string="uid={username},dc=example,dc=com" />
1
2
3
4
5
6
7
8
9
10
11
12
13$container->loadFromExtension('security', array(
'firewalls' => array(
'main' => array(
'form_login_ldap' => array(
'login_path' => 'login',
'check_path' => 'login_check',
'service' => 'ldap',
'dn_string' => 'uid={username},dc=example,dc=com',
// ...
),
),
)
);
HTTP Basic登錄之配置示例??
1
2
3
4
5
6
7
8
9
10
11# app/config/security.ymlsecurity: # ...
firewalls:main: # ...http_basic_ldap: # ...service:ldapdn_string:'uid={username},dc=example,dc=com'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:srv="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">
1
2
3
4
5
6
7
8
9
10
11
12$container->loadFromExtension('security', array(
'firewalls' => array(
'main' => array(
'http_basic_ldap' => array(
'service' => 'ldap',
'dn_string' => 'uid={username},dc=example,dc=com',
// ...
),
'stateless' => true,
),
),
);