0

私は自分のサイトのいくつかのページへのユーザーのアクセスの管理に取り組んでいます。私には1種類の完全に認証されたユーザー(role: ROLE_MEMBERに基づくROLE_USER)があり、もちろん匿名ユーザーもいます。

サイトに2ページ(/index、 )があり、両方とも。requireとrequires (for )としましょう。/accountsecure: true/indexrole: IS_AUTHENTICATED_ANONYMOUSLY/accountrole: IS_AUTHENTICATED_FULLYROLE_MEMBER

ログインしたメンバー専用の「アカウントメニュー」を両方のページに表示したいので、テンプレートでチェックしis_granted('ROLE_MEMBER')ます。

/accountもちろん、これはうまく機能します。メンバーが/index(「匿名」ページである)に移動すると、関数はをis_granted('ROLE_MEMBER')返し0、をis_granted('IS_AUTHENTICATED_ANONYMOUSLY')返します1。メンバーが再びに移動する/accountと、パスワードを再入力しなくてもすべてが機能します(つまり、メンバーはまだログアウトしていません)。

/indexそれで、問題は、ページのテンプレート内のユーザーにログインしているメンバーをどのように検出するかです。

更新しました。@alessandro1997ここに私のapp/config/security.yml設定があります

security:
    encoders:
        AG\MemberBundle\Entity\Member:
            id: member_saltedpassword_encoder

    role_hierarchy:
        ROLE_MEMBER: ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_MEMBER, ROLE_ALLOWED_TO_SWITCH]

    providers:
        member_db:
            entity: { class: AGMemberBundle:Member, property: email }

    firewalls:
        members:
            pattern:  ^/account
            security: true
            form_login: 
                login_path: /account/login
                check_path: /account/login/check
                post_only: true
                username_parameter:  _email
                password_parameter:  _password
                default_target_path: /account/
                always_use_default_target_path: true
                # csrf token options
                csrf_parameter: _csrf_token
                intention: authenticate
            provider: member_db
            logout:
                path: /account/logout
                target: /
            remember_me:
                key:      "qwewqeqwerwxeweqweqwe"
                lifetime: 3600
                path:     /
                domain:   ~ # Defaults to the current domain from $_SERVER
        pages:
            pattern: ^/
            security: true
            anonymous: ~

    access_control:
        - { path: ^/account, roles: IS_AUTHENTICATED_FULLY }
        - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
4

2 に答える 2

1

これは、2つの別個のファイアウォールを使用していて、1つのファイアウォールに対してのみユーザーを認証しているために発生しています。これらは完全に別個のセキュリティシステムです。ファイアウォールを1つだけ設定し、異なる役割が署名されたaccess_controlを使用する必要があります。

私は非常によく似た問題を抱えていました-ここでそれをチェックしてください-> Symfony2-ファイアウォールとアクセス制御の問題

于 2012-06-13T08:39:14.427 に答える
0

私はそれが問題であるかもしれないと思います:

access_control:
    - { path: ^/account, roles: IS_AUTHENTICATED_FULLY }
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }

最初に/accountへのアクセスを設定し、次にインデックスパスへのアクセスでオーバーライドします:/。交換しても大丈夫だと思います。さらに、authenticated_annonymouslyのユーザーにアクセス制御を使用しても意味がないと思います。代わりにそれを使用してください:

access_control:
    - { path: ^/account, roles: IS_AUTHENTICATED_FULLY }

もう1つの問題は、loginとlogin_checkがファイアウォールの背後に隠れていることです。完全に認証されたユーザーに対してのみ/ accountパスを設定しているため、ログインしようとするユーザーはログインページを表示できません。

form_login: 
            login_path: /account/login
            check_path: /account/login/check

私はそれがそのようなもので動作するはずだと信じています:

    firewalls:
          login_firewall: 
              pattern:    ^/account/login$
              anonymous:  ~
    access_control:
    - { path: ^/account, roles: IS_AUTHENTICATED_FULLY }
    - { path: ^/account/login, roles: IS_AUTHENTICATED_ANONYMOUSLY}
    - { path: ^/account/login_check, roles: IS_AUTHENTICATED_ANONYMOUSLY}

ただし、私のアプリでは、/ accountからloginパスとlogin_checkパスを取得しただけなので、security.ymlは次のようになります。

security:
firewalls:
    login_firewall: 
        pattern:    ^/login$
        anonymous:  ~
    secured_area:
        pattern:    ^/
        form_login:
            login_path:  /login
            check_path:  /login_check
            always_use_default_target_path: true
            default_target_path: /
        logout:
            path:   /logout
            target: /

providers:
    main:
        entity: { class: Core\UserBundle\Entity\User, property: username }
encoders:
    Core\UserBundle\Entity\User: 
        algorithm:   sha256
        iterations: 10
        encode_as_base64: true
access_control:
    - { path: ^/admin, roles: ROLE_SUPERADMIN }
    - { path: ^/user, roles: ROLE_USER }
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

私はSymfonyの専門家ではないので、完璧な解決策ではないかもしれませんが、それがお役に立てば幸いです;)

于 2012-06-12T07:42:52.683 に答える