Symfony2如何使所有会话属性无效

时间:2015-04-27 09:10:31

标签: symfony session logout

在我的Symfony2项目中,我有一个logout按钮,该按钮会重定向到索引页面,但是当我点击Login按钮时,它会直接连接,而不会询问我userpassword

如何验证所有session attributes,如果再次login我应该问我userpassword

这是我的logout行动:

public function logoutAction(Request $request)
    {    
        $this->get('security.context')->setToken(null);
        $this->get('request')->getSession()->invalidate();

        $url = $this->generateUrl('my_route');
        $response = new RedirectResponse($url);
        $response->headers->clearCookie('PHPSESSID');
        $response->send();
        return $response;
    }   

这是 security.yml

security:

    encoders:
        Envivio\UserBundle\Entity\User: sha512

    role_hierarchy:
        ROLE_USER:        ROLE_USER
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]

    providers:        
        mine:
            id: ib_user.oauth_user_provider

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false        

        main:
            anonymous: true
            pattern: ^/
            oauth:
                resource_owners:
                    salesforce: "/login/check-salesforce"
                login_path:   /login
                #use_forward:  false
                failure_path: /login
                default_target_path: /upload
                oauth_user_provider:
                    service: ib_user.oauth_user_provider                
            remember_me:
                key:     "%secret%"


    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }       
        - { path: ^/admin, role: ROLE_ADMIN }

2 个答案:

答案 0 :(得分:1)

您可以尝试:

$this->get('session')->clear();

$session = $this->get('session');
$ses_vars = $session->all();
foreach ($var as $key => $value) {
    $session->remove($key);
}

也可能是Cookie问题,请在answer->标题中检查您的Cookie,然后尝试使用该功能清除它:

http://api.symfony.com/2.3/Symfony/Component/HttpFoundation/ResponseHeaderBag.html#method_clearCookie

编辑:

由于你记得我启用你需要清除那个cookie,否则你做的下一个请求将重新认证用户,你可以指定cookie的名称:

  #security.yml

    remember_me:
             name: "%session.remember_me.name%"

在parameters.yml中添加cookie的名称

parameters:
    session.remember_me.name: EXTSESS

然后在您的控制器注销操作中:

$response = $this->redirectToRoute('homepageroute'); //redirect prepare the route to redirect
$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();
$remember_sess_name = $this->container->getParameter('session.remember_me.name');

$response->headers->clearCookie($remember_sess_name);

return $response;

现在应该可以了。如果这不是ALT + F4:D

答案 1 :(得分:0)

您无需手动执行此操作。 Symfony2防火墙可以执行以下注销:

# app/config/security.yml
security:
    firewalls:
        secured_area:
            # ...
            logout:
                path:   /logout
                target: /
    # ...
     

接下来,您需要为此网址创建路由(但不是   控制器):

# app/config/routing.yml
logout:
    path:   /logout
     

就是这样!通过将用户发送到/ logout(或您配置的任何内容)   ()的路径,Symfony将取消当前用户的身份验证。

     

一旦用户退出,他们将被重定向到任何东西   路径由上面的目标参数(例如主页)定义。

指向相关文档的链接:http://symfony.com/doc/current/book/security.html#logout