FOSUserBundle的分组功能

原文地址http://symfony.com/doc/current/bundles/FOSUserBundle/groups.html

FOSUserBundle允许你对用户进行分组. 分组是区分角色集合的一种方式. 一个组里面的用户会被授予这个组里面所有角色的权限.

Symfony支持角色继承, 所以从组中继承角色不是必须的. 如果在你的使用场景中继承了足够多的角色, 最好还是使用继承, 因为它更为高效.(分组功能需要数据库的驱动.)

你需要在配置文件中明确启用这个启用分组功能. 唯一强制性的就是要配置你实现了FOS\UserBundle\Model\GroupInterface接口的Group类的完全限定名(fully qualified class name).

下面是一个支持分组功能的配置例子:

1
2
3
4
5
6
7
# app/config/config.yml
fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\User
group:
group_class: AppBundle\Entity\Group

分组类

创建分组类的最简单的方式就是去继承FOSUserBundle提供的映射过的超类.

ORM 分组类的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// src/AppBundle/Entity/Group.php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\Group as BaseGroup;
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="fos_group")
*/
class Group extends BaseGroup
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
}

因为Group是SQL中的一个保留的关键字, 所以它不能用于表名.

MongoDB 分组类的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// src/AppBundle/Document/Group.php

namespace AppBundle\Document;

use FOS\UserBundle\Model\Group as BaseGroup;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
* @MongoDB\Document
*/
class Group extends BaseGroup
{
/**
* @MongoDB\Id(strategy="auto")
*/
protected $id;
}
CouchDB 分组类的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// src/AppBundle/CouchDocument/Group.php

namespace AppBundle\CouchDocument;

use FOS\UserBundle\Model\Group as BaseGroup;
use Doctrine\ODM\CouchDB\Mapping\Annotations as CouchDB;

/**
* @CouchDB\Document
*/
class Group extends BaseGroup
{
/**
* @CouchDB\Id
*/
protected $id;
}

定义用户与分组的关系

下一步就是在你的User类中进行关系映射

ORM用户-分组映射

Annotations 配置方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
// src/AppBundle/Entity/User.php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;

/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Group")
* @ORM\JoinTable(name="fos_user_user_group",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
protected $groups;
}

YAML配置方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# src/AppBundle/Resources/config/doctrine/User.orm.yml
AppBundle\Entity\User:
type: entity
table: fos_user
id:
id:
type: integer
generator:
strategy: AUTO
manyToMany:
groups:
targetEntity: Group
joinTable:
name: fos_user_group
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
group_id:
referencedColumnName: id
MongoDB用户-分组映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// src/AppBundle/Document/User.php

namespace AppBundle\Document;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
* @MongoDB\Document
*/
class User extends BaseUser
{
/** @MongoDB\Id(strategy="auto") */
protected $id;

/**
* @MongoDB\ReferenceMany(targetDocument="AppBundle\Document\Group")
*/
protected $groups;
}
CouchDB用户-分组映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// src/AppBundle/CouchDocument/User.php

namespace AppBundle\CouchDocument;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ODM\CouchDB\Mapping\Annotations as CouchDB;

/**
* @CouchDB\Document
*/
class User extends BaseUser
{
/**
* @CouchDB\Id
*/
protected $id;

/**
* @CouchDB\ReferenceMany(targetDocument="AppBundle\CouchDocument\Group")
*/
protected $groups;
}

启用分组控制器的路由

你可以导入group.xml路由文件来使用内置的控制器来操作分组.

1
2
3
4
# app/config/routing.yml
fos_user_group:
resource: "@FOSUserBundle/Resources/config/routing/group.xml"
prefix: /group