搜尋

首頁  >  問答  >  主體

symfony2針對bundle需要一個controller作為入口文件,進行權限限制

這裡是不是使用ControllerListener.php進行監聽/

1、我想知道同過一個controller對其中幾個bundle進行存取權限的限制,例如:判斷使用者如果未登錄,直接跳到首頁或登陸頁面。
2、針對一個bundle存取權限如何設定。是基於使用者的

为情所困为情所困2782 天前507

全部回覆(2)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-05-16 16:48:22

    太靈活,太多辦法了,暫寫一個方面吧:

    有第三方的做好的使用者功能包:FOSUserBundle

    自己寫的話,在用登入表單之前,你需要告訴框架使用者資訊是怎麼儲存的,如果你用Doctrine和資料庫的話,你得寫一個User的Entity,實作SymfonyComponentSecurityCoreUserUserInterface介面。

    (一)建立使用者類別

    namespace Acme\UserBundle\Entity;
    
    use Symfony\Component\Security\Core\User\UserInterface;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     */
    class User implements UserInterface
    {
        /**
         * @ORM\Column(type="string", length=255)
         */
        protected $username;
    
        // ...
    }

    (二)使用這個使用者類別

    # app/config/security.yml
    security:
        # ...
        providers:
            main:
                entity: { class: Acme\UserBundle\Entity\User, property: username }
        encoders:
            Acme\UserBundle\Entity\User: sha512 # 密码用哪种hash保存

    (三)新增權限控制

    安全校驗可以在URL層面來控制,你讓你的bundle共享某個URL規則,就可以用一條規則來控制:

    # app/config/security.yml
    security:
        # ...
        access_control:
            - { path: ^/some_url, roles: ROLE_USER } # role是用户需要具备的角色,登录成功默认会有ROLE_USER

    也可以用Symfony 2自備的JMSSecurityExtraBundle,可以用註解來設定:

    use JMS\SecurityExtraBundle\Annotation\Secure;
    
    class MyController
    {
        /**
         * @Secure(roles="ROLE_USER")
         */
        public function secureAction()
        {
            // ...
        }
    }

    Symfony 2的安全元件配置很多,可以參考:http://symfony.com/doc/current/refere...

    表單驗證(form_login),也就是最常見的登入框形式,是Symfony 2安全元件預設支援的驗證方式之一,其他的還有X.509,HTTP Basic,HTTP Digest等等,還可以透過第三方代碼包增加別的驗證方式。表單驗證的設定項如下,我註解了常用的一些項目:

    form_login:
        check_path: /login_check # 登录校验URL
        login_path: /login # 登录表单页
        use_forward: false
        always_use_default_target_path: false # 登录后是否总是跳向指定目标页
        default_target_path: / # 登录后的目标页
        target_path_parameter: _target_path # 在登录表单里指定目标页使用的input name
        use_referer: false
        failure_path: /foo
        failure_forward: false
        failure_handler: some.service.id # 自定义登录失败的处理
        success_handler: some.service.id # 自定义登录成功的处理
        username_parameter: _username # 登录表单里用户名的input name
        password_parameter: _password # 登录表单里用户名的input name
        csrf_parameter: _csrf_token
        intention: authenticate
        csrf_provider: my.csrf_provider.id
        post_only: true
        remember_me: false # 是否启用“记住我”功能

    還有內建的ACL,可以提供更細粒度的控制。不過那是另外一個大篇章了。

    回覆
    0
  • 某草草

    某草草2017-05-16 16:48:22

    十分感謝你的回答,內建的ACL確實十分強大,謝謝你

    回覆
    0
  • 取消回覆