symfony2中的ACL实现

时间:2015-11-30 06:15:38

标签: php symfony doctrine-orm acl fosuserbundle

是symfony的新手,需要处理ACL部分 我需要在我的项目中构建ACl,可以在下表中解释

Users/Access    User_List_View  User_Create User_Edit   User_Delete User_Status Edit_ownDetails
Super Admin     Yes             Yes         Yes         Yes         Yes         Yes
Admin           Yes             No          Yes         No          Yes         Yes
Client          No              No          No          No          No          Yes

角色分配

User    Role
User-A  Super Admin
User-B  Admin
User-C  Client
User-D  Client

我检查了下面的许多链接
http://symfony-gu.ru/documentation/en/html/cookbook/security/acl.html
https://github.com/Problematic/ProblematicAclManagerBundle
https://www.adayinthelifeof.nl/2012/07/04/symfony2-implementing-acl-rules-in-your-data-fixtures/
http://knpuniversity.com/screencast/question-answer-day/symfony2-users-menu-cms
https://knpuniversity.com/screencast/symfony-voters
http://kriswallsmith.net/page/4
http://problematic.io/2012/03/10/symfony2-bundles-i-cant-live-without/

我发现最受欢迎的是FOSUserbundle,但是我需要用角色手动编写,同样我也检查了选民,这也是一个很好但我的客户的要求是他甚至应该能够为每个用户创建自定义权限。所以我需要实现类似于表结构的ACL,这对他来说很容易在个人层面进行修改。

为了创建示例,我试图实现http://symfony.com/doc/current/cookbook/security/acl.html,但是从链接中我并没有清楚地知道在哪里为用户添加角色以及如何检查网格中的角色和访问权限。该文件似乎很难理解实施。

如果有人以某种方式或使用任何第三方库实现了这一点吗?

即使我已经在stackoverflow中检查了以下链接,但没有我可以使用的响应 Symfony Acl implementation
How to make advanced ACL in Symfony2? Check if a role is granted for a specific user in Symfony2 ACL https://stackoverflow.com/questions/6915502/symfony2-acl-roles-and-users

1 个答案:

答案 0 :(得分:0)

以下解决方案对我有用。

在继续之前,您必须按照http://symfony.com/doc/current/cookbook/security/acl.html

中给出的步骤进行操作

在用户表中,将列添加为角色,如问题

中的“角色分配”下所指定

在位于src / AppBundle / Entity / User.php的User.php文件中添加get和set方法

/**
* Set roles
*
* @param boolean $roles
*
* @return User
*/
public function setRoles($roles)
{
    $this->roles = $roles;    
    return $this;
}

/**
* Get roles
*
* @return boolean
*/
public function getRoles()
{
    return array($this->roles);
}

现在检查上面的getRoles()我已经返回一个数组,因为symfony还提供了一个用户可以拥有多个角色的条款,所以要么在数据库的角色字段中指定一个数组,要么指定一个角色,而不仅仅是从user.php文件中返回一个数组

请注意每个角色前缀为' ROLE _'比如ROLE_ADMIN,ROLE_USER等。

通过上述内容,我们为每个用户指定了ROLE。

现在在你的security.yml中 指定访问控制

security:
    encoders:
        AppBundle\Entity\User:
            algorithm: bcrypt

    acl:
        connection: default

    # http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    providers:
        our_db_provider:
            entity:
                class: AppBundle:User
                property: username
                # if you're using multiple entity managers
                # manager_name: customer
        in_memory:
            memory: ~

    firewalls:
        default:
            pattern:    ^/
            http_basic: ~
            provider: our_db_provider
            anonymous: ~
            #http_basic: ~
            form_login:
                login_path: /login
                check_path: /login_check

    access_control:
        # require ROLE_ADMIN for /admin*
        - { path: ^/admin, roles: ROLE_ADMIN }