【问题标题】:Symfony2 how to invalidate all the session attributesSymfony2如何使所有会话属性无效
【发布时间】:2015-07-05 15:42:10
【问题描述】:

在我的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 }

【问题讨论】:

  • 您的注销操作路由是否与您的防火墙模式匹配?
  • 是的,完美匹配
  • 检查你的会话参数中还有什么?
  • 如何查看会话参数??

标签: symfony session logout


【解决方案1】:

你可以试试:

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

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

也可能是 cookie 问题,检查响应中的 cookie->headers,然后尝试使用该函数清除它:

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

【讨论】:

  • 我尝试使用此方法$this->get('request')->cookies->remove("PHPSESSID"); 清除会话但它不起作用,我尝试了不同的方法但它没有解决问题
  • 你试过我说的了吗?因为你说你试过 $this->get('request')->cookies->remove("PHPSESSID");但这不是我建议的,您的配置也可能有问题,尝试查找缺少的内容或错字,也可以使用安全 yml 编辑您的问题
  • 答案已编辑。我尝试了你告诉我的一切,但它不起作用
  • 清除后您的会话中还有什么?还有饼干,里面是什么?
  • 还是不行,我也试过在security.yml中禁用remember_me但是不行
【解决方案2】:

您无需手动操作。 Symfony2 防火墙可以像这样执行注销:

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

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

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

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

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

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

【讨论】:

  • 但是我想在logout 之后重定向的routemy_home_page 并且它有2 个parameters,我如何在target path 中设置参数?
  • 你至少不能轻易做到。要么建立一个新的路线after_logout 并重定向到您希望用户在注销后登陆的路线,或者使用custom logout handler
  • 或者,如果可行,您可以在该路由上设置 2 个默认值。
  • 不可能,参数会变,应该是通用的
  • @ihssan 所以按照 ferdynator 的建议使用“注销后”重定向
猜你喜欢
  • 2015-07-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多