angular - 如何在 Angular 中生成服务器端会话变量?
问题描述
我已经 jz 完成了对我自己的 Angular 应用程序的一点修改。首先,我有一个包含 PUBLIC、MEMBER、ADMIN 访问角色的菜单导航列表。登录后,我将角色“会员”存储给用户,他可以在其中查看公共和会员链接。(使用 Chrome)但后来我打开
Developer Tools > Application > Storage > Session Storage
将“角色”变量从“成员”操作到“管理员”,我可以查看秘密管理员链接。
这不是编码结构问题,而是“如何以安全方式存储会话变量”。在此之前,我认为 PHP 的会话变量等同于“会话存储”,社区表示 SESSION 不能由用户https://stackoverflow.com/a/6912409/8163746更改。
然后现在我了解到,有两种类型的会话,服务器端会话和客户端会话。对于标准的角度应用程序,存储“电子邮件”、“角色”的最佳方式是什么,但用户不能修改?我在会话中需要它们的原因是它们可以很容易地被调用
Role - Show/Hide navigation menu items
Email - to perform SQL filter, SELECT fields FROM Record WHERE email=Session.Email
感谢您的建议。
解决方案
用户可以修改浏览器上的所有内容。因此,在执行操作之前,您还需要验证您在服务器上选择的任何会话机制。
例如,您可以使用 Json Web Tokens (JWT)。
当您使用 API 登录时,API 会生成一个安全令牌,该令牌会在身份验证成功后发送给客户端。该安全令牌是加密的,可以包含任何信息,例如用户 ID 和角色。
然后将该令牌存储在浏览器上(在本地存储、会话存储或 cookie 中)。Cookies 是最安全的选项,允许身份验证与 Angular Universal 一起使用
令牌随每个 API 调用一起传递。如果您使用 cookie,它们将自动传递。如果使用本地或会话存储,您可以创建一个
HttpInterceptor
将令牌添加到请求中。然后,API 会在执行操作之前验证令牌是否有效以及用户角色。
因此,即使您将用户角色存储在客户端,并且如果客户端修改该角色,该操作也不会在 API 端执行,这是最重要的。
推荐阅读
- java - 完成方法后如何获取taskid
- ssh - 如何通过链接 ssh
- python - 使用python selenium下载pdf无法检索嵌入框架中的url
- linux - 确定如何调用 linux 进程
- java - Java 使用哪种算法进行乘法运算?
- nginx - Nginx 上 Drupal 的 AMP 参数错误
- reactjs - 为什么我无法从另一台计算机连接到我的 create-react-app 本地开发服务器?
- php - GMail 创建转发解决另一个域范围的委派问题 - PHP
- discord - 不和谐机器人如何在线?
- python - 用猜出的字母代替破折号/ Hangman / Python