Heim > Fragen und Antworten > Hauptteil
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
伊谢尔伦2017-05-16 16:48:22
太灵活,太多办法了,暂写个一个方面吧:
有第三方的做好的用户功能包: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,可以提供更加细粒度的控制。不过那是另外一个大篇章了。