Access_Control 拒绝匿名令牌用户通过
Access_Control refuses anonymous token'ed user to go through
我正在用 Angular 中的前端应用程序和 Symfony2(2.7,需要尽快迁移到 3.3)中的 REST API 后端构建一个项目。
后端方面,我正在使用 FOSRestBundle、FOSUSerBundle、LexikAuthBundle 和一堆其他很酷的包来满足 REST API 的需求。
我最近通过社交提供商 Google 和 Facebook 实现了一次登录(前端登录按钮,然后创建 fos_user 后端并手动设置为刚刚识别的用户,由 LexikBundle 提供的 JWT)。这适用于以下 app\config\security.yml
:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_API: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/api/login
stateless: true
anonymous: true
form_login:
check_path: /api/login_check
login_path: /api/login
require_previous_session: false
username_parameter: username
password_parameter: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
api:
pattern: ^/api
stateless: true
anonymous: true
lexik_jwt:
authorization_header:
enabled: true
prefix: Bearer
query_parameter:
enabled: true
name: bearer
always_authenticate_before_granting: true
access_control:
- { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/registration., roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, roles: [IS_AUTHENTICATED_FULLY, ROLE_API] }
这适用于 /api/login/social 路由(数据在正文中,POST),但无法到达 /api/registration :( :
INFO - Matched route "myapp_security_register".
Context: {"route_parameters": {"_controller":"myapp\CoreBundle\Controller\SecurityController::registerAction","_route":"myapp_security_register"},"request_uri":"http://127.0.0.1:8000/api/registration"}
INFO - Populated the TokenStorage with an anonymous Token.
ERROR - Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException: "You do not have the necessary permissions" at C:\projects\myappAPI\vendor\friendsofsymfony\rest-bundle\FOS\RestBundle\EventListener\AccessDeniedListener.php line 70
Context: {"exception":"Object(Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException)"}
我不明白,因为设置了匿名令牌!为什么 access_control 不让 /api/registration 访问我的控制器?我错过了什么?
如果可能有帮助,我还可以 post FOSRestBundle 配置。
谢谢博尔
您的 access_control
指令中有一个 错字:
- { path: ^/api/registration., roles: ['..'] }
...应该是
- { path: ^/api/registration, roles: ['..'] }
我正在用 Angular 中的前端应用程序和 Symfony2(2.7,需要尽快迁移到 3.3)中的 REST API 后端构建一个项目。
后端方面,我正在使用 FOSRestBundle、FOSUSerBundle、LexikAuthBundle 和一堆其他很酷的包来满足 REST API 的需求。
我最近通过社交提供商 Google 和 Facebook 实现了一次登录(前端登录按钮,然后创建 fos_user 后端并手动设置为刚刚识别的用户,由 LexikBundle 提供的 JWT)。这适用于以下 app\config\security.yml
:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_API: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/api/login
stateless: true
anonymous: true
form_login:
check_path: /api/login_check
login_path: /api/login
require_previous_session: false
username_parameter: username
password_parameter: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
api:
pattern: ^/api
stateless: true
anonymous: true
lexik_jwt:
authorization_header:
enabled: true
prefix: Bearer
query_parameter:
enabled: true
name: bearer
always_authenticate_before_granting: true
access_control:
- { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/registration., roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, roles: [IS_AUTHENTICATED_FULLY, ROLE_API] }
这适用于 /api/login/social 路由(数据在正文中,POST),但无法到达 /api/registration :( :
INFO - Matched route "myapp_security_register".
Context: {"route_parameters": {"_controller":"myapp\CoreBundle\Controller\SecurityController::registerAction","_route":"myapp_security_register"},"request_uri":"http://127.0.0.1:8000/api/registration"}
INFO - Populated the TokenStorage with an anonymous Token.
ERROR - Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException: "You do not have the necessary permissions" at C:\projects\myappAPI\vendor\friendsofsymfony\rest-bundle\FOS\RestBundle\EventListener\AccessDeniedListener.php line 70
Context: {"exception":"Object(Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException)"}
我不明白,因为设置了匿名令牌!为什么 access_control 不让 /api/registration 访问我的控制器?我错过了什么? 如果可能有帮助,我还可以 post FOSRestBundle 配置。
谢谢博尔
您的 access_control
指令中有一个 错字:
- { path: ^/api/registration., roles: ['..'] }
...应该是
- { path: ^/api/registration, roles: ['..'] }