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