Symfony API路由权限配置:如何开放无需Token的路由
我来帮你搞定这个配置问题!你的核心问题出在安全规则的匹配顺序和部分冗余配置上,调整一下就能实现/api/vehicules免Token访问的需求。
问题根源
Symfony的access_control规则是从上到下依次匹配的,你现在把^/api(要求全认证)的规则放在了/api/vehicules(允许匿名)的前面,导致所有/api开头的请求都会先触发全认证要求,后面的匿名规则根本不会生效。另外你额外配置的vehicule和lexik_jwt防火墙是冗余的,反而可能干扰规则生效。
修改后的完整security.yaml配置
security: encoders: App\Entity\User: algorithm: argon2i providers: app_user_provider: entity: class: App\Entity\User property: email firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false login: pattern: ^/api/login stateless: true anonymous: true json_login: check_path: /api/login_check success_handler: lexik_jwt_authentication.handler.authentication_success failure_handler: lexik_jwt_authentication.handler.authentication_failure api: pattern: ^/api stateless: true anonymous: true # 必须开启匿名,否则防火墙会直接拦截未认证请求 guard: authenticators: - lexik_jwt_authentication.jwt_token_authenticator main: anonymous: true access_control: # 注意:先配置不需要认证的路由,顺序优先! - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/api/vehicules, roles: IS_AUTHENTICATED_ANONYMOUSLY } # 最后配置需要全认证的其他/api路由 - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
关键改动说明
调整
access_control顺序
把允许匿名访问的/api/vehicules和/api/login放在最前面,这样当请求匹配到这两个路由时,会直接应用匿名规则,不会触发后面的全认证要求。api防火墙开启
anonymous: true
如果你的api防火墙没有开启匿名访问,即使access_control允许匿名,防火墙也会直接拒绝未携带Token的请求,这一步是必须的。移除冗余配置
删掉你之前添加的vehicule和lexik_jwt防火墙块,api防火墙已经覆盖了所有/api开头的路由,不需要单独拆分。另外注意把lexik_jwt的authorization_header.enabled改回true(默认就是true,你之前设为false会导致无法解析Bearer Token)。
验证效果
现在访问/api/vehicules不需要携带Token即可正常请求,而其他/api下的路由(比如/api/user)会要求携带有效的JWT Token才能访问。
内容的提问来源于stack exchange,提问作者JohanL11

