以编程方式在Symfony2上登录用户

时间:2014-02-27 08:23:41

标签: php symfony

版本: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()对象?

3 个答案:

答案 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方法,这会抛出此错误消息。