Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 以编程方式登录Symfony2上的用户_Php_Symfony - Fatal编程技术网

Php 以编程方式登录Symfony2上的用户

Php 以编程方式登录Symfony2上的用户,php,symfony,Php,Symfony,版本:Symfony2.3 有许多链接显示了如何在Symfony上以编程方式登录,或者如何在登录时动态更改用户角色。我参考了一些网站,让代码正常工作 在这个过程之下 使用用户名和密码进行用户登录 用户将被重定向到组列表页 用户将选择一个组 我们将动态更改与所选组映射的角色,并重定向用户 一切正常 但问题是: 我正在使用下面的代码获取所有页面中的用户id,在更改“令牌”后停止工作 我有一个基于不同组动态更改当前用户角色的功能 // Save the original token in the

版本:Symfony2.3

有许多链接显示了如何在Symfony上以编程方式登录,或者如何在登录时动态更改用户角色。我参考了一些网站,让代码正常工作

在这个过程之下

  • 使用用户名和密码进行用户登录
  • 用户将被重定向到组列表页
  • 用户将选择一个组
  • 我们将动态更改与所选组映射的角色,并重定向用户
一切正常

但问题是: 我正在使用下面的代码获取所有页面中的用户id,在更改“令牌”后停止工作

我有一个基于不同组动态更改当前用户角色的功能

// 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()工作。

谢谢,它解决了我的问题,搜索了将近一天:)谢谢,它解决了我的问题,搜索了将近一天:)