【发布时间】:2018-09-15 03:50:33
【问题描述】:
我正在开发一个项目,它使用 Angular 作为前端,Symfony 作为后端,目前我正在使用 Token 系统进行身份验证,据我们所知,步骤如下:
- 向后端提供用户名和密码
- 生成令牌
- 使用
localStorage在客户端保存它 - 每次向后端发送请求时,检查令牌是否已过期并再次刷新
为了实现这一点,我必须安装三个捆绑包:
- LexikJWTAuthenticationBundle:用于创建令牌系统
- JWTRefreshTokenBundle: 用于刷新令牌系统
- NelmioCorsBundle:处理 CORS 请求
所以我的问题是,当我们可以使用 Symfony 的默认身份验证系统时,为什么还要使用这些东西?!
如果我错了,请纠正我:
我们可以简单地使用这些步骤而不安装任何额外的包:
- 向后端提供用户名和密码
- 使用 symfony 的默认身份验证系统(的 当然是在配置防火墙之后)
- 每次我们发送一个请求(在控制器中)我们可以检查是否
用户使用此方法登录
$this->getUser();(这将 如果他没有连接,则返回null)
对于 CORS 请求,我们可以简单地创建一个带有标题 array('Access-Control-Allow-Origin'=> '*') 的自定义响应,让我们这样说:
class APIResponse extends Response
{
function __construct($content, $status = 201, array $headers = array('Access-Control-Allow-Origin' => '*', 'Content-Type' => 'application/json'))
{
if(is_array($content)) parent::__construct(json_encode($content), $status, $headers);
else throw new LogicException('The response must be an array, '.gettype($content).' given');
}
}
这只是一个想法,我希望你们指出正确的方向并解释为什么我们应该使用令牌而不是 symfony 的默认身份验证系统。
【问题讨论】:
-
令牌允许您跳过在服务器上存储会话数据。无状态的解决方案。但只要这不是问题,那么 Symfony 安全系统就可以了。请考虑使用 isGranted 功能而不是 getUser。请注意,虽然自然倾向于寻找捆绑软件来实现这类东西,但捆绑软件通常可能是矫枉过正的。一些特定于您需要的代码通常就是您真正需要的。
-
@Cerad 正是我不喜欢为一个小应用程序安装很多包,谢谢你的回答:)
标签: angular symfony jwt access-token restful-authentication