如何在开发期间向用户授予角色?

时间:2014-10-14 10:00:50

标签: php security symfony firewall roles

是否可以动态地向当前用户(我)授予角色?

我在本地计算机上的网站上工作,服务器正在托管网站的制作版本。 2个版本(devprod)使用使用CAS服务器的身份验证系统,我们更改了防火墙以避免在dev环境中使用此身份验证系统。但是在本地工作时我只是以匿名用户身份登录,防火墙配置为只有在从127.0.0.1地址连接时才允许匿名用户访问管理。所以我可以看到管理的任何部分,但我无法在开发过程中模拟来自不同角色的访问。

换句话说,我正在寻找类似的东西:

class AcmeController
{
    public AcmeAction()
    {
        ...
        $user->setRole('ROLE_ADMIN');
        ...
    }
}

或设置角色的任何其他方式。

更新

我测试了这个:

class AcmeController
{
    public AcmeAction()
    {
        ...
        $user = $this->getUser();
        $user->setRole('ROLE_ADMIN');
        ...
    }
}

这会带来致命错误:

  

致命错误:在[...]行的[...] AcmeController.php中的非对象上调用成员函数addRole()

我认为这是由于当前用户是匿名的,因此它不存在于数据库中,我无法访问User对象。

1 个答案:

答案 0 :(得分:0)

我需要直接在User环境中使用dev实体并在prod环境中使用SSO / LDAP捆绑包来加载数据库中的任何用户。

解决方案是更改配置文件,以便在devprod环境中使用不同的登录控制器:

app / config / security.yml :将加载变量的位置

security:
    [...]
    providers:
        %security_providers%
    firewalls:
        dev:
            [...]
        user_manager: %security_firewalls_user_management%

app / config / config_dev.yml app / config / config_test.yml :声明变量

登录使用传统的登录表单

parameters:
    security_providers:
        user_db:
            entity:
                class: Acme\AcmeBundle\Entity\User
                property: id
    security_firewalls_user_management:
        pattern:    ^/
        anonymous: ~
        form_login: ~
        logout: ~
        switch_user: true
    login_controller: "AcmeDevBundle:Security:login"

app / config / config_prod.yml :声明变量

parameters:
    security_providers:
        user_auth:
            entity:
                class: Acme\AcmeBundle\Entity\User
                property: other_id
   security_firewalls_user_management:
        pattern: ^/
        anonymous: ~
        trusted_sso:
            manager: user_sso
            login_action: false
            logout_action: false
            check_path: /
            login_path: page_login
        logout: true
        switch_user: true
    login_controller: "AcmeBundle:Main:login"

应用程序/ AppKernel.php

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            [...]
        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            [...]
            # Bundle only activated in dev and test environments
            $bundles[] = new Acme\DevBundle\AcmeDevBundle();
        }

        return $bundles;
    }
[...]

DevBundle仅在devtest环境中加载,它使用traditional login form并显示用户名单,而不是我可以冒充。