API Platform项目:UI文档基础认证保护与部分路由公开需求
解决API Platform的Basic Auth保护UI与路由权限差异化配置问题
嘿,针对你用API Platform开发项目的需求——用Basic Authentication保护UI文档,同时给部分路由开公共访问,我给你梳理一套完整的实现方案,结合你给出的代码片段补全说明:
第一步:配置Basic Authentication(Symfony层面)
首先得在Symfony的security.yaml里搭好Basic Auth的基础配置:
security: enable_authenticator_manager: true password_hashers: Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' providers: # 替换成你项目实际的用户提供者,比如数据库用户实体 app_user_provider: entity: class: App\Entity\User property: email firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: lazy: true provider: app_user_provider http_basic: ~ # 开启Basic Auth验证 anonymous: true # 必须开启匿名访问,不然公共路由会被直接拦截 access_control: # 把API文档UI(Swagger/OpenAPI界面)保护起来,仅登录用户可访问 - { path: ^/api/docs, roles: ROLE_USER } # 其他API路由默认按资源级配置走,这里可以留空或者设置全局兜底规则
第二步:资源级别的权限精细化配置
你给出的代码已经有了核心思路,我帮你补全并拆解每个配置的作用:
<?php namespace App\Entity; use ApiPlatform\Metadata\ApiResource; use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter; /** * 已下单菜品 */ #[ApiResource( // 全局默认权限:所有未单独配置的操作,都要求用户拥有ROLE_USER权限 attributes: ["access_control" => "is_granted('ROLE_USER')"], collectionOperations: [ // 集合GET接口:开放公共访问,允许匿名用户查看列表 "get" => ["access_control" => "is_granted('" . AuthenticatedVoter::IS_AUTHENTICATED_ANONYMOUSLY . "')"], // 集合POST接口:仅管理员账号能创建新的下单菜品 "post" => ["access_control" => "is_granted('ROLE_ADMIN')"] ], itemOperations: [ // 单个菜品GET接口:沿用全局默认规则,需登录用户才能查看详情 "get" => ["access_control" => "is_granted('ROLE_USER')"], // 单个菜品修改接口:示例规则,仅管理员或菜品所属用户可修改 "put" => ["access_control" => "is_granted('ROLE_ADMIN') or object.getUser() == user"], // 删除接口:仅管理员有权限操作 "delete" => ["access_control" => "is_granted('ROLE_ADMIN')"] ] )] class OrderedDish { // 你的实体字段、关联关系等代码... }
关键配置细节说明:
- 全局默认权限:
attributes里的access_control是所有操作的兜底规则,避免重复写相同权限逻辑 - 匿名访问的正确姿势:用
AuthenticatedVoter::IS_AUTHENTICATED_ANONYMOUSLY常量(或直接写字符串'IS_AUTHENTICATED_ANONYMOUSLY'),确保未登录用户能访问指定路由 - UI文档保护:通过
security.yaml的access_control规则,把/api/docs路由限制给登录用户,匿名访问会直接弹出Basic Auth登录框 - 差异化权限:每个操作可以单独覆盖全局规则,比如POST只开放给管理员,修改操作可以限定给资源所有者
验证配置是否生效
- 访问
/api/docs:会弹出Basic Auth登录框,只有带ROLE_USER权限的登录用户能查看文档 - 访问
/api/ordered_dishes(集合GET):无需登录就能拿到数据 - 尝试POST请求到
/api/ordered_dishes:必须用管理员账号登录,否则返回403权限错误 - 访问单个菜品
/api/ordered_dishes/1:需要登录用户才能查看详情
这样就完美实现了你要的需求:UI文档被Basic Auth保护,同时指定路由开放公共访问,其他路由按权限精细化控制。
内容的提问来源于stack exchange,提问作者xfscrypt
相关产品推荐
相关产品推荐

