将Symfony 2用户安全性从一个bundle转移到另一个bundle

3
我刚接触Symfony 2,之前没有用过任何框架。
我创建了两个bundles,一个是用作核心网站的,URL为根目录/,它叫做DefaultBundle。然后我创建了一个新的UserBundle,并将所有的路由设置为/user/,登录页面是/user/login,它可以正常工作。
到目前为止,我能够登录用户,一切似乎都能工作。
问题真正在于,如何在DefaultBundle中检查用户是否已登录,以便在前端网站右上角显示Welcome User而不是login/register链接。
附:我的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

编辑:

这个能用依赖注入实现吗?如果可以,怎么做呢...


问题:您是否成功在新的Bundle中创建了一个新的security.yml文件?如果是,您是如何做到的? - Braian Mellor
不,我没有创建security.yml文件。 - Aamir Mahmood
4个回答

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: ~

0

我尝试了这个,但是出现了以下错误:Fatal error: Call to a member function isAuthenticated() on a non-object in D:\xampp\htdocs\myVital\src\Aala\Vital\FrontendBundle\Controller\PageController.php on line 12 - Aamir Mahmood
如果可能的话,请发布完整的security.yml文件。 - madflow

0
你需要将两个bundle的路由都放在同一个防火墙后面,才能让$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}

我已经尝试过了,但它会在每个页面上像/contact-us一样带我到/user/login。 - Aamir Mahmood
ACL和单个防火墙的组合绝对是正确的选择,但我在这个安全配置上遇到了一些问题。等我有时间了再仔细看看。 - james_t

0

你可以在文档这里找到它。

{% 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


我尝试了你的解决方案,但是出现了“安全上下文不包含身份验证令牌。可能的原因之一是该URL未配置防火墙。”的错误提示。 - Aamir Mahmood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接