Symfony2 benötigt einen Controller als Eintragsdatei für das Bundle, um Berechtigungen einzuschränken.
为情所困
为情所困 2017-05-16 16:46:22
0
2
478

Verwenden Sie ControllerListener.php zur Überwachung/

1. Ich möchte wissen, wie ich die Zugriffsrechte mehrerer Bundles über denselben Controller einschränken kann. Wenn der Benutzer beispielsweise nicht angemeldet ist, springen Sie direkt zur Startseite oder Anmeldeseite.
2. So legen Sie Zugriffsberechtigungen für ein Bundle fest. Es ist benutzerbasiert

为情所困
为情所困

Antworte allen(2)
伊谢尔伦

太灵活,太多办法了,暂写个一个方面吧:

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

自己写的话,在用登录表单之前,你需要告诉框架用户信息是怎么保存的,如果你用Doctrine和数据库的话,你得写一个User的Entity,实现Symfony\Component\Security\Core\User\UserInterface接口。

(一)创建用户类

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,可以提供更加细粒度的控制。不过那是另外一个大篇章了。

某草草

十分感谢你的回答,内置的ACL确实十分强大,谢谢你

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage