Symfony 2从一个捆绑包到另一个捆绑包的用户安全性

时间:2012-11-08 14:18:49

标签: php symfony

我是Symfony 2的新手,之前从未使用任何框架。

我创建了2个捆绑包,一个用于核心网站,其中url是以/为根DefaultBundle,然后我创建了一个新的UserBundle并将所有路由设置为/user/登录页面是/user/login,它运行正常。

到目前为止,我能够登录用户,似乎每件事都有效。

问题确实是,如何在DefaultBundle登录用户登录,因此我在前端网站的右上角显示了Welcome User而不是login/register个链接

P.S。我不需要FOSuserBundle作为答案,

下面的

来自我的security.yml文件

jms_security_extra:
    secure_all_services: false
    expressions: true

security:
    encoders:
       Aala\Vital\UserBundle\Entity\User: 
          algorithm: plaintext
#              encode_as_base64: false
#              iterations: 1

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

providers:
    user_area:
      entity: {class: AalaVitalUserBundle:User, property: email}

firewalls:

    login:
        pattern:  ^/user/login$
        security: false
        anonymous: true

    user_area:
        pattern:    ^/user
        form_login:
            login_path: /user/login
            check_path: /user/login_check
            post_only: true
            default_target_path: /user/
        logout:
            path:   /user/logout
            target: /user/

    main:
        pattern: ^/
        security: true
        anonymous: ~


access_control:
    - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/user, roles: ROLE_USER }

我的文件夹结构如下

-src
    -Aala
        -Vital
            -FronendBundle
            -UserBundle

编辑:

这可以通过依赖注入来完成吗?如果是的话怎么做......

4 个答案:

答案 0 :(得分:2)

解决

要在两个防火墙之间共享身份验证,请使用context。以下是我的security.yml文件中更新的防火墙部分

firewalls:

    login:
        pattern:  ^/user/login$
        security: false
        anonymous: true

    user_area:
        pattern:    ^/user
        context: primary_auth
        form_login:
            login_path: /user/login
            check_path: /user/login_check
            post_only: true
            default_target_path: /user/
        logout:
            path:   /user/logout
            target: /user/

    main:
        pattern: ^/
        context: primary_auth
        security: true
        anonymous: ~

答案 1 :(得分:0)

根据控制器中的文档:

http://symfony.com/doc/current/book/security.html#retrieving-the-user-object

public function indexAction()
{
    $user = $this->getUser();

    if($user->isAuthenticated()) {
        // Stuff
    }
}

答案 2 :(得分:0)

您需要将两个捆绑包的路由放在同一防火墙后面才能使$user = $this->getUser();正常工作。然后,如果您希望网站的某个部分未经身份验证,则可以允许使用ACL进行匿名访问。

firewalls:
    site:
        pattern:    ^/
        anonymous: ~
        form_login:
            login_path: /user/login
            check_path: /user/login_check
            post_only: true
            default_target_path: /
        logout:
            path:   /user/logout
            target: /user/

access_control:
    - { path: ^/user/, roles: ROLE_USER}

答案 3 :(得分:0)

您可以在dosc here中找到它。

{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
    {{ 'Welcome ' ~ app.user.username }}
    <a href="{{ path('logout_route') }}">Logout</a>
{% else %}
    <a href="{{ path('login_route') }}">Login</a>
{% endif %}

更改login_routelogout_route以符合您的申请路线。

为什么不想使用FOSUserBundle?这是一个非常好的捆绑,由核心成员编写,例如你可以找到这段代码right here