我在 Symfony 上做授权,在实现中没有什么特殊问题,我从数据库中设置了一个检查,一切正常:
# app/config/security.yml
security::
Delivery\AdminBundle\Entity\User:
algorithm: bcrypt
providers:
user_db_provider:
entity:
class: DeliveryAdminBundle:User
property: username
firewalls:
main:
pattern: ^/admin
provider: user_db_provider
anonymous: ~
form_login:
login_path: _security_login #login route
check_path: _security_check #credentials check route
failure_path: _security_login #failed login route
default_target_path: a_home #successfull login route
logout:
path: _security_logout #logout route
target: a_home #route to redirect after logout
access_control:
- { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_ADMIN }
您还需要使用相同的 ^/admin 路由配置直接授权,无需输入登录名/密码,而是将授权类型传递给 url - 电子邮件、哈希以进行验证,并在验证成功时进行授权。
这里https://habrahabr.ru/post/134005/描述了实现,但我无法弄清楚系统将如何“理解”使用哪种类型 - 直接还是通过登录表单?
您不能为同一个 url 创建不同的防火墙。
我会这样做。我会创建一个单独的“打开”网址,用户可以在查询字符串中使用电子邮件+哈希访问该网址。然后您可以在控制器中验证此哈希,然后手动创建并保存用户令牌。
重新启动后,系统会将当前会话的用户视为已授权用户。