我正在尝试利用Symfony的身份验证和授权功能,但是我对于我的security.yml文件看起来有点困惑。
我希望实现以下目标:
1)路由/和/ join(可供所有人使用 - 无需登录)。
2)所有其他路线都需要登录/密码。
3)/ adimin路由应仅限于管理员用户。
4)所有用户都应该针对数据库进行身份验证。
我有第4项想出来(我认为) - 见下文。我不确定administrators:
这个词的意思。这是否只表示管理员使用User类?应该说users:
还是其他什么?
security:
encoders:
MySite\Bundle\Entity\User:
algorithm: sha1
encode_as_base64: false
iterations: 1
providers:
administrators: (??? what doest his mean ???)
entity: { class: MySiteBundle:User }
更重要的是 -
对于第1,2和3项我不知道该放什么。我在firewalls:
部分和access_control:
部分下面有一堆条目,但它不起作用或有意义。有人可以发布什么security.yml看起来应该只是通过我想要在数字1 - 3中完成的目标?
答案 0 :(得分:9)
以下是我根据您的需求了解的配置示例:
security:
encoders:
"MySite\Bundle\Entity\User": { algorithm: sha1, encode_as_base64: false, iterations: 1 }
providers:
database: { entity: "MySite\Bundle\Entity\User" }
firewalls:
dev:
pattern: ^/(_profiler|_wdt|css|js)
security: false
main:
pattern: ^/
provider: database
anonymous: true
# the rest of your firewall's config
access_control:
- { path: ^/(join)?$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: IS_AUTHENTICATED_FULLY }
我们为用户实体配置密码编码器,并为其定义提供程序。
然后我们定义一个dev
防火墙来停用debug / profiler / asset pathes的安全性,以及一个main
防火墙,它将是应用程序的真正防火墙。最后一个防火墙将使用先前定义的用户提供程序并允许不合理的用户(重要!)。
最后,在访问控制图中,我们首先为允许匿名用户提供的pathes定义规则,然后为需要用户对网站其余部分进行完全身份验证的通用规则。
答案 1 :(得分:4)
对于其他提出此问题或类似问题的人,我已经设法使用security.yml中的以下设置来实现此功能。
security:
encoders:
MySite\Bundle\Entity\User:
algorithm: sha1
encode_as_base64: false
iterations: 1
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
database:
entity: { class: MySiteBundle:User }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
prod:
pattern: ^/
provider: database
anonymous: true
form_login:
check_path: /login_check
login_path: /login
default_target_path: /home
always_use_default_target_path: true
logout:
path: /logout
target: /
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/build, roles: ROLE_USER }
- { path: ^/join, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }