【问题标题】:How to grant a role to a user during development?如何在开发过程中向用户授予角色?
【发布时间】:2014-12-09 01:53:14
【问题描述】:

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

我正在本地计算机上开发网站,服务器正在托管网站的生产版本。 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 对象。

【问题讨论】:

  • 为什么不直接授予user ROLE_SUPER_ADMIN 并在role_hierarchy 中的security.yml 中定义它,以便包装所有 角色?
  • @jperovic : 已经是这样了,但是当我根本没有登录时,我不知道如何授予这个角色。
  • 如果你没有登录,你不能使用$this->getUser(),它会返回null... 为什么没有从你的数据库中获取用户? $user=$em->getRepository('AppAcmeBundle:User')->find(YOUR_ID); ?

标签: php security symfony firewall roles


【解决方案1】:

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

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

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

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

app/config/config_dev.ymlapp/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"

app/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 并显示我无法模拟的用户列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2020-04-27
    • 2017-05-31
    • 2019-04-13
    • 2016-11-19
    相关资源
    最近更新 更多