如何修改当前用户的属性并将其保留在整个会话中

时间:2013-02-18 20:05:38

标签: authentication symfony service ldap symfony-2.1

我正在使用IMAG / Ldap-Bundle(BorisMorel / LdapBundle)对我的用户进行身份验证,并且我无法将对User所做的任何更改保留到我的LDAP服务器。但是每当用户登录时,我都需要在本地检查一些内容并根据一些规则添加用户的角色。

每当imag验证我的LDAP服务器上的用户/密码时,它都会调用我创建的正在监听'bind'事件的服务。这是怎么回事:

ldap_user_verifier:
    class: MyBundle\Service\LdapUserVerifierService
    arguments: [ @security.context, @doctrine.orm.default_entity_manager, @twig ]
    tags:
        - { name: 'kernel.event_listener', event: imag_ldap.security.authentication.pre_bind, method: loadUser }

注意:bind_username_before设置为false,这意味着LdapUserVerifierService::loadUser只会在用户登录后调用User类加载到我的security.context }。

然后我就像这样LdapUserVerifierService::loadUser

public function loadUser(LdapUserEvent $event) {

    $ldapUser = $event->getUser();

    [...]

    $ldapUser->setLocalUser($localUser);
    $ldapUser->addRole('ROLE_USER');
    [...]

}

除非我的用户更改页面(例如,从/login_check/dashboard),否则效果很好,我对security.context.getToken().getUser()的修改将丢失。我的用户在localUser上关联了ROLE_USER/login_check,但/dashboard上没有关联。

因为我的用户没有从我的应用程序的数据库加载,所以我无法将其保留在数据库中以便在后续的网页分页中加载,因此,如果不保存另一个会话变量,则无法保留我的对象更改。

有谁知道我应该怎么处理这个?

谢谢。

1 个答案:

答案 0 :(得分:-2)

没有足够的代码来提供更好的答案,但我没有看到你在哪里修改security.context或令牌。

更改了从令牌获得的用户对象后,您可能需要将此修改后的用户设置为令牌。