Php 以编程方式登录Symfony2上的用户
版本:Symfony2.3 有许多链接显示了如何在Symfony上以编程方式登录,或者如何在登录时动态更改用户角色。我参考了一些网站,让代码正常工作 在这个过程之下Php 以编程方式登录Symfony2上的用户,php,symfony,Php,Symfony,版本:Symfony2.3 有许多链接显示了如何在Symfony上以编程方式登录,或者如何在登录时动态更改用户角色。我参考了一些网站,让代码正常工作 在这个过程之下 使用用户名和密码进行用户登录 用户将被重定向到组列表页 用户将选择一个组 我们将动态更改与所选组映射的角色,并重定向用户 一切正常 但问题是: 我正在使用下面的代码获取所有页面中的用户id,在更改“令牌”后停止工作 我有一个基于不同组动态更改当前用户角色的功能 // Save the original token in the
- 使用用户名和密码进行用户登录
- 用户将被重定向到组列表页
- 用户将选择一个组
- 我们将动态更改与所选组映射的角色,并重定向用户
// 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()对象?首先检查是否有
用户对象:
if ($this->getUser()) {
$id = $this->getUser()->getId();
}
在您的例子中,User
对象是NULL
,因此您尝试从抛出此错误消息的NULL
对象调用getId()
方法,而不是从User
对象调用该方法。首先检查是否有User
对象:
if ($this->getUser()) {
$id = $this->getUser()->getId();
}
在您的例子中,User
对象是NULL
,因此您尝试从NULL
调用getId()
方法,而不是从抛出此错误消息的User
对象调用该方法。您在会话中设置了一个值,但没有保存它。所以你应该保存它:
$this->get('session')->set('security_secured_area',serialize($token));
$this->get('session')->save(); // add this line
您在会话中设置了一个值,但没有保存它。所以你应该保存它:
$this->get('session')->set('security_secured_area',serialize($token));
$this->get('session')->save(); // add this line
在上面的部分中,您正在使用UsernamePasswordToken创建令牌。这接受4个参数。第一个参数可以是:
用户名(如昵称、电子邮件地址等)、UserInterface实例或实现uu-toString方法的对象
您正在传递用户名。而是传递用户实体,这样就可以让$this->getUser()->getId()工作
在上面的部分中,您正在使用UsernamePasswordToken创建令牌。这接受4个参数。第一个参数可以是:
用户名(如昵称、电子邮件地址等)、UserInterface实例或实现uu-toString方法的对象
您正在传递用户名。改为传递用户实体,这样就可以让$this->getUser()->getId()工作。谢谢,它解决了我的问题,搜索了将近一天:)谢谢,它解决了我的问题,搜索了将近一天:)