<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Symfony中文教程 &#187; role</title>
	<atom:link href="http://www.newlifeclan.com/symfony/archives/tag/role/feed" rel="self" type="application/rss+xml" />
	<link>http://www.newlifeclan.com/symfony</link>
	<description>站在巨人肩膀上的phpweb框架</description>
	<lastBuildDate>Fri, 12 Dec 2025 00:58:27 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>KU案例2之10给数据库中的用户添加角色</title>
		<link>http://www.newlifeclan.com/symfony/archives/294</link>
		<comments>http://www.newlifeclan.com/symfony/archives/294#comments</comments>
		<pubDate>Thu, 09 Apr 2015 14:37:48 +0000</pubDate>
		<dc:creator><![CDATA[napoleon]]></dc:creator>
				<category><![CDATA[实战教程]]></category>
		<category><![CDATA[role]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[symfony2.6]]></category>

		<guid isPermaLink="false">http://www.newlifeclan.com/symfony/?p=294</guid>
		<description><![CDATA[<p>很多时候，所有的用户只能得到一个角色：ROLE_USER，这是因为我们的User entity中的getRol [&#8230;]</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/294">KU案例2之10给数据库中的用户添加角色</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>很多时候，所有的用户只能得到一个角色：ROLE_USER，这是因为我们的User entity中的getRoles()的默认返回值所导致。</p>
<p><span id="more-294"></span></p>
<p>所以我们要在User entity中添加一个字段roles，并且把它设置成json_array类型：</p><pre class="crayon-plain-tag">// src/Acme/UserBundle/Entity/User.php
// ...

/**
 * @ORM\Column(type="json_array")
 */
private $roles = array();</pre><p>json_array()允许我们存储一个字符串数组到一个字段里。在数据库中，这些数组被存储为JSON字符串。Doctrine来负责array和JSON之间的转换工作。</p>
<p>现在我们要更新getRoles()方法，并添加setRoles方法：</p><pre class="crayon-plain-tag">public function getRoles()
{
    return $this-&gt;roles;
}

public function setRoles(array $roles)
{
    $this-&gt;roles = $roles;

    // allows for chaining
    return $this;
}</pre><p>很酷，但是现在的方式，用户的用户角色很可能为空。他们变成了僵尸用户，他们能够登录，但不能访问页面，我们不能让这种事情发生。</p>
<p>应该在getRoles()添加一些逻辑，来保证每个用户都有ROLE_USER。</p><pre class="crayon-plain-tag">public function getRoles()
{
    $roles = $this-&gt;roles;
    $roles[] = 'ROLE_USER';

    return array_unique($roles);
}</pre><p>更新一下数据库</p><pre class="crayon-plain-tag">php app/console doctrine:schema:update --force</pre><p>让我们添加一个ROLE_ADMIN角色的用户</p><pre class="crayon-plain-tag">// src/Acme/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...

public function load(ObjectManager $manager)
{
    // ...
    $manager-&gt;persist($user);

    $admin = new User();
    $admin-&gt;setUsername('wayne');
    $admin-&gt;setPassword($this-&gt;encodePassword($admin, 'waynepass'));
    $admin-&gt;setRoles(array('ROLE_ADMIN'));
    $manager-&gt;persist($admin);

    $manager-&gt;flush();
}</pre><p>运行下面命令添加数据</p><pre class="crayon-plain-tag">php app/console doctrine:fixtures:load</pre><p>现在我们用管理员登陆，debug条会显示我们有ROLE_USER和ROLE_ADMIN角色。</p>
<h2>使用AdvancedUserBundle禁用不活跃用户</h2>
<p>我们可以对一些不怎么来网站的用户进行禁用操作。</p>
<p>添加一个isActive的boolean字段到User entity。如果这个字段为假，那么程序会阻止用户进行身份验证。不要忘了在命令行运行 doctrine:generate:entities 来生成get和set方法：</p><pre class="crayon-plain-tag">/ src/Acme/UserBundle/Entity/User.php
// ...

/**
 * @var bool
 *
 * @ORM\Column(type="boolean")
 */
private $isActive = true;

// ...
// write or generate your getIsActive and setIsActive methods...</pre><p>在那之后，更新我们的数据库字段</p><pre class="crayon-plain-tag">php app/console doctrine:schema:update --force</pre><p>现在isActive字段已经存在了，但是它还不能的在登陆中使用。为了使他能工作，要将User类的UserInterface替换成implements AdvancedUserInterface；</p><pre class="crayon-plain-tag">// src/Acme/UserBundle/Entity/User.php
// ...

use Symfony\Component\Security\Core\User\AdvancedUserInterface;

class User implements AdvancedUserInterface
{
    // ...
}</pre><p>这里 AdvancedUserInterface继承UserInterface。</p>
<p>新的接口是一个更强大的UserInterface他需要四个额外的方法。如果这些方法返回false，Symfony将阻止用户登录。为了证明这一点，除了isAccountNonLocked都返回true：</p><pre class="crayon-plain-tag">// src/Acme/UserBundle/Entity/User.php
// ...

public function isAccountNonExpired()
{
    return true;
}

public function isAccountNonLocked()
{
    return false;
}

public function isCredentialsNonExpired()
{
    return true;
}

public function isEnabled()
{
    return true;
}</pre><p>现在登录不太好玩了：我们堵住了有用的信息。</p>
<p>这里所有的方法都在做同样的事情：就是阻止登陆。如果你想你可以翻译每个用户带来的不同信息。设置每一个都为true，除了isEnabled。让他返回isActive属性的值：</p><pre class="crayon-plain-tag">/ src/Acme/UserBundle/Entity/User.php
// ...

public function isAccountNonLocked()
{
    return true;
}

public function isEnabled()
{
    return $this-&gt;getIsActive();
}</pre><p>如果isActive为false，这应该阻止用户登录。</p>
<p>我们更改不活跃的用户：</p><pre class="crayon-plain-tag">// src/Acme/UserBundle/DataFixtures/ORM/LoadUsers.php
// ...

public function load(ObjectManager $manager)
{
    // ...
    $admin-&gt;setIsActive(false);
    // ...
}</pre><p>运行命令：</p><pre class="crayon-plain-tag">php app/console doctrine:fixtures:load</pre><p>当我们尝试登录，程序自动阻止。爽！</p>
<p>哈哈，学会了吧。我们可以还原程序了，让用户能够登录进来。</p>
<p>&nbsp;</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/294">KU案例2之10给数据库中的用户添加角色</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.newlifeclan.com/symfony/archives/294/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
