版本:Symfony2.3
有许多链接显示如何在Symfony上以编程方式登录或在登录时动态更改用户角色。我引用了一些网站并使代码正常工作。
在流程下面,
每件事都很好。
但问题是: 我使用下面的代码来获取所有Pages中的用户ID,在更改“Token”后停止工作
$id = $this->getUser()->getId();
我有一个功能,可以根据不同的组动态更改当前用户角色
// Save the original token in the session
$originalToken = $this->get("security.context")->getToken();
$this->getRequest()->getSession()->set('original.security.token', $originalToken);
// Create my new custom token (loading the roles of the user)
$token = new \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken($this->getUser()->getUsername(), null, "secured_area", array($dynamic_rolename));
// Update the security context with the new token
$this->get("security.context")->setToken($token);
$this->get('session')->set('security_secured_area',serialize($token));
执行上述功能后,行$this->getUser()->getId()
无效。
Error: FatalErrorException: Error: Call to a member function getId() on a non-object
Security.yml
security:
encoders:
Core\Bundle\Entity\login:
algorithm: sha1
encode_as_base64: false
iterations: 1
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
administrators:
entity:
class: Core\Bundle\Entity\login
property: userName
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/login$
security: false
anonymous: ~
context: administration
secured_area:
pattern: ^/
context: administration
form_login:
check_path: _security_check
login_path: /login
default_target_path: /admin/setfacility
logout:
path: _demo_logout
target: _demo
#anonymous: ~
#http_basic:
# realm: "Secured Demo Area"
为什么没有设置getUser()对象?
答案 0 :(得分:3)
// Create my new custom token (loading the roles of the user)
$token = new \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken($this->getUser()->getUsername(), null, "secured_area", array($dynamic_rolename));
在上一节中,您使用UsernamePasswordToken来创建令牌。这接受4个参数。第一个参数可以是:
用户名(如昵称,电子邮件地址等),或UserInterface实例或实现__toString方法的对象。
您只是传递用户名。改为通过用户实体,以便您可以使用$ this-> getUser() - > getId()。
答案 1 :(得分:1)
您将值设置为会话但未保存。所以你应该保存它:
$this->get('session')->set('security_secured_area',serialize($token));
$this->get('session')->save(); // add this line
答案 2 :(得分:0)
首先检查您是否有User
个对象:
if ($this->getUser()) {
$id = $this->getUser()->getId();
}
在您的情况下User
对象为NULL
,因此您尝试从getId()
而不是NULL
对象调用User
方法,这会抛出此错误消息。