【问题标题】:symfony user secured area checksymfony 用户安全区域检查
【发布时间】:2013-07-02 12:24:15
【问题描述】:

我有一个供登录用户使用的安全区域 像这样-->

firewalls:
    members_secured_area:
                pattern: ^/
                provider: entity_searchers
                anonymous: ~
                form_login:
                    check_path: /searchers/login_check
                    login_path: /searchers/login
                    default_target_path: /searchers/
                logout:
                    path:   /searchers/logout
                    target: /searchers/login

    crm_secured_area:
                pattern: ^/crm/
                provider: entity_crmusers
                anonymous: ~
                form_login:
                    check_path: /crm/login_check
                    login_path: /crm/login
                    default_target_path: /crm/customers
                logout:
                    path:   /crm/logout
                    target: /crm/login
                remember_me:
                    #token_provider: entity_crmusers
                    key: someS3cretKey
                    name: NameOfTheCookie
                    lifetime: 3600 # in seconds
                    secure: false
                    httponly: true
                    always_remember_me: false
                    remember_me_parameter: _remember_me
access_control:
    members_login:
        path: /searchers/login
        roles: IS_AUTHENTICATED_ANONYMOUSLY
    members_register:
        path: /searchers/register
        roles: IS_AUTHENTICATED_ANONYMOUSLY
    members_area:
        path: /searchers/.*
        roles: ROLE_USER

    crm_login:
        path: /crm/login
        roles: IS_AUTHENTICATED_ANONYMOUSLY
    crm_register:
        path: /crm/register
        roles: IS_AUTHENTICATED_ANONYMOUSLY
    crm_area:
        path: /crm/.*
        roles: ROLE_CRM

所以当用户在安全区域时,我可以看到他已登录, 但是当他返回主页或 mysite.com/about 页面时 我不知道他是否登录...

有办法知道吗?

【问题讨论】:

    标签: php security symfony


    【解决方案1】:

    在控制器中,您可以使用 $this->getUser() 获取用户。当用户登录时,它返回一个 User 类的实例,否则返回 NULL,所以你可以这样做:

    $user = $this->getUser();
    
    $is_logged = isset($user);
    

    $is_logged 是布尔值,如果用户已登录则为 true,否则为 false。

    【讨论】:

    • 是的,我知道这一点,但这仅在安全区域内有效……例如,它在主页上不起作用。
    【解决方案2】:

    您只能在安全区域(估计低谷pattern)下获得有效用户。因此,与给定 pattern 不匹配的所有内容都不在防火墙之下,也没有用户令牌。您可以通过保护整个站点并使用新的访问规则来更改此设置

    firewalls:
        crm_secured_area:
            pattern: ^/crm/
            # ... stuff
        members_secured_area:
            pattern: ^/
            anonymous: ~
            # ... all other config
    
    access_control:
        # ... all your existing access rules
        - { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY }
    

    最后一条规则允许所有尚未匹配任何规则的路由匿名访问它们,并且您可以访问所有控制器中的用户令牌(如果已通过身份验证)。

    【讨论】:

    • 我编辑了我的帖子,以便您可以看到全貌,正如您所见,我有 2 种类型的用户和 2 个防火墙,在您的报价中,一个防火墙会干扰另一个。
    • 两种类型的防火墙都不是问题,因为您可以共享安全上下文,但是与两个不同的用户提供商...我认为您无法在不同用户之间进行转换。但是你的用例有点不同。尝试将members_secured_area 放在crm_secured_area 之后。因此,只有搜索也在主页上进行了身份验证,但 crm 用户仅在 crm 中进行了身份验证。试一试。
    【解决方案3】:

    找到了这个解决方案,只需在主站点的模式中放置:^/(?!crm) 表示不包含文件夹 crm。

    防火墙: members_secured_area: 模式:^/(?!crm) 提供者:entity_searchers 匿名:~ 表单登录: check_path: /searchers/login_check 登录路径:/搜索者/登录 default_target_path:/搜索者/ 登出: 路径:/搜索者/注销 目标:/searchers/login

    crm_secured_area:
                pattern: ^/crm/
                provider: entity_crmusers
                anonymous: ~
                form_login:
                    check_path: /crm/login_check
                    login_path: /crm/login
                    default_target_path: /crm/customers
                logout:
                    path:   /crm/logout
                    target: /crm/login
                remember_me:
                    #token_provider: entity_crmusers
                    key: someS3cretKey
                    name: NameOfTheCookie
                    lifetime: 3600 # in seconds
                    secure: false
                    httponly: true
                    always_remember_me: false
                    remember_me_parameter: _remember_me
    

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多