是否可以动态地向当前用户(我)授予角色?
我在本地计算机上的网站上工作,服务器正在托管网站的制作版本。 2个版本(dev
和prod
)使用使用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
对象。
答案 0 :(得分:0)
我需要直接在User
环境中使用dev
实体并在prod
环境中使用SSO / LDAP捆绑包来加载数据库中的任何用户。
解决方案是更改配置文件,以便在dev
和prod
环境中使用不同的登录控制器:
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
仅在dev
和test
环境中加载,它使用traditional login form并显示用户名单,而不是我可以冒充。