每一種身份驗證機制 (例如 HTTP 身份驗證,登錄表單等) 恰好使用一個提供程序,默認情況下將使用第一個聲明的用戶提供程序 。但是如果您想要通過配置文件制定一些用戶來驗證,其他的用戶信息存在數(shù)據(jù)庫里該怎么辦?我們可能可以通過創(chuàng)建一個新的供應程序并把它和以前的提供程序串聯(lián)在一起:
YAML:
# app/config/security.yml
security:
providers:
chain_provider:
chain:
providers: [in_memory, user_db]
in_memory:
memory:
users:
foo: { password: test }
user_db:
entity: { class: Acme\UserBundle\Entity\User, property: username }
XML:
<!-- app/config/security.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<srv:container xmlns="http://symfony.com/schema/dic/security"
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">
<config>
<provider name="chain_provider">
<chain>
<provider>in_memory</provider>
<provider>user_db</provider>
</chain>
</provider>
<provider name="in_memory">
<memory>
<user name="foo" password="test" />
</memory>
</provider>
<provider name="user_db">
<entity class="Acme\UserBundle\Entity\User" property="username" />
</provider>
</config>
</srv:container>
PHP:
// app/config/security.php
$container->loadFromExtension('security', array(
'providers' => array(
'chain_provider' => array(
'chain' => array(
'providers' => array('in_memory', 'user_db'),
),
),
'in_memory' => array(
'memory' => array(
'users' => array(
'foo' => array('password' => 'test'),
),
),
),
'user_db' => array(
'entity' => array(
'class' => 'Acme\UserBundle\Entity\User',
'property' => 'username',
),
),
),
));
現(xiàn)在,所有的身份驗證機制都將使用 chain_provider(串聯(lián)提供程序),因為它是第一次被指定的。Chain_provider 將依次嘗試從 in_memory(內(nèi)存)和 user_db(數(shù)據(jù)庫用戶表)提供程序中加載用戶。
您還可以通過配置防火墻或個人的身份驗證機制來使用一個特定的提供程序。再次申明,除非顯式指定提供程序,則始終會使用第一個提供程序:
YAML:
# app/config/security.yml
security:
firewalls:
secured_area:
# ...
pattern: ^/
provider: user_db
http_basic:
realm: "Secured Demo Area"
provider: in_memory
form_login: ~
XML:
<!-- app/config/security.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<srv:container xmlns="http://symfony.com/schema/dic/security"
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">
<config>
<firewall name="secured_area" pattern="^/" provider="user_db">
<!-- ... -->
<http-basic realm="Secured Demo Area" provider="in_memory" />
<form-login />
</firewall>
</config>
</srv:container>
PHP:
// app/config/security.php
$container->loadFromExtension('security', array(
'firewalls' => array(
'secured_area' => array(
// ...
'pattern' => '^/',
'provider' => 'user_db',
'http_basic' => array(
// ...
'provider' => 'in_memory',
),
'form_login' => array(),
),
),
));
在此示例中,如果用戶試圖通過 HTTP 身份驗證登錄,身份驗證系統(tǒng)將使用 in_memory 用戶提供程序。但如果用戶嘗試通過表單登錄,將使用 user_db 提供程序(因為默認它是作為一個整體防火墻)。
有關(guān)用戶提供程序和防火墻配置的詳細信息,請參閱 SecurityBundle 配置 ("安全")。