symfony2中的防火墙安全问题

时间:2013-12-01 09:16:42

标签: symfony symfony-security

我正在使用symfony2并且在symfony防火墙中有一些关于身份验证和访问控制的问题。

这是我的security.yml

security:
    encoders:
        test\UserBundle\Entity\User:
        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: UserBundle:User, property: email }

firewalls:

    login_firewall:
        pattern:    ^/login$
        anonymous:  ~
        security: true

    admin_area:
        pattern:    ^/cp|/(cp/.*|login_check)
        http_basic: ~
        form_login:
            login_path:  _login
            check_path:  login_check
            always_use_default_target_path: true

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY|ROLE_USER }
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(booking/hotelsearchresult), roles: IS_AUTHENTICATED_ANONYMOUSLY }

事情就在这个网站上,管理员没有/ admin路径或spesefic路径。 admin由每个页面中的Role定义,并且页面的conteint根据用户类型而不同。 (我知道这很糟糕。)

这意味着我必须让所有用户访问所有页面,如果他们登录,他们会获得不同类型的数据。

但我有以下错误:

当我登录并将用户发送到另一条路径(不是作为安全路径定义)时,它没有显示任何信用信息?!!!

如何使用此结构访问数据?

2 个答案:

答案 0 :(得分:1)

您所写的内容:如果您的路径不在防火墙下,则凭据信息在此处不可用,因为防火墙不会覆盖它们。

在您的特定情况下,您将可以访问以/cp开头的路线上的凭据信息 。您可能想要做的是将防火墙模式定义为^/。这样您的防火墙就会覆盖您网站上的所有路径,然后使用access_control或您使用的任何方法来检查特定网页的访问权限。

答案 1 :(得分:0)

您可以使用控制器中的以下代码检查特定用户的角色:

public function indexAction()
{
    // show different content to admin users
    if ($this->get('security.context')->isGranted('ROLE_ADMIN')) {
        // ... load admin content here
    }

    // ... load other regular content here
}