Symfony 6.4下JWT认证已获Token,求后续操作指导
Symfony JWT认证后续操作指导
1. 保护API路由
修改config/packages/security.yaml,为需要认证的路由配置JWT防火墙,确保只有携带有效Token的请求能访问:
security: firewalls: api: pattern: ^/api stateless: true jwt: ~ access_control: - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
2. 在控制器中获取当前认证用户
通过Security服务可以直接拿到已认证的用户实例,用于业务逻辑处理:
use Symfony\Component\Security\Core\Security; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; class UserController extends AbstractController { public function getProfile(Security $security): JsonResponse { $user = $security->getUser(); return $this->json([ 'id' => $user->getId(), 'email' => $user->getEmail(), 'roles' => $user->getRoles() ]); } }
3. 配置Token刷新机制
避免用户频繁登录,启用刷新Token功能:
- 在
config/packages/lexik_jwt_authentication.yaml中添加刷新Token配置:
lexik_jwt_authentication: token_ttl: 3600 # 主Token有效期1小时 refresh_token: enabled: true ttl: 2592000 # 刷新Token有效期30天 user_provider: App\Security\UserProvider # 替换为你的用户提供者
- 添加刷新Token路由到
config/routes.yaml:
api_refresh_token: path: /api/token/refresh methods: [POST] controller: lexik_jwt_authentication.controller.refresh_token::refreshTokenAction
之后用户可以用过期的主Token+刷新Token请求该接口,获取新的主Token。
4. 前端集成要点(若有前端)
- 登录成功后,将返回的
token和refresh_token存储在本地(如localStorage) - 所有API请求的请求头中携带
Authorization: Bearer {token} - 捕获接口返回的401错误,自动调用刷新Token接口获取新Token,并重试原请求
5. 细化权限控制
根据用户角色限制路由访问:
- 在
security.yaml的access_control中添加角色规则:
access_control: - { path: ^/api/admin, roles: ROLE_ADMIN } - { path: ^/api/profile, roles: ROLE_USER }
- 控制器中可通过
isGranted()方法校验权限:
public function adminDashboard() { if (!$this->isGranted('ROLE_ADMIN')) { throw $this->createAccessDeniedException('无管理员权限'); } // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Jihed Kh
相关产品推荐
相关产品推荐

