【问题标题】:How to generate a server side session variable in Angular?如何在 Angular 中生成服务器端会话变量?
【发布时间】:2020-06-19 17:13:05
【问题描述】:

我已经 jz 完成了对我自己的 Angular 应用程序的一点修改。 首先,我有一个包含 PUBLIC、MEMBER、ADMIN 访问角色的菜单导航列表。 登录后,我将角色“会员”存储给用户,他可以在其中查看公共和会员链接。 (使用 Chrome)但后来我打开了

Developer Tools > Application > Storage > Session Storage

将“角色”变量从“成员”操作到“管理员”,我可以查看秘密管理员链接。

这不是编码结构问题,而是“如何以安全方式存储会话变量”。 在此之前,我认为 PHP 的 session 变量相当于 'Session Storage',社区说 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

感谢您的建议。

【问题讨论】:

    标签: angular session session-storage


    【解决方案1】:

    用户可以修改浏览器上的所有内容。因此,在执行操作之前,您还需要验证您在服务器上选择的任何会话机制。

    例如,您可以使用 Json Web 令牌 (JWT)。

    1. 当您使用 API 登录时,API 会生成一个安全令牌,该令牌会在身份验证成功后发送给客户端。该安全令牌是加密的,可以包含任何信息,例如用户 ID 和角色。

    2. 然后将该令牌存储在浏览器中(在 本地存储、会话存储或 cookie)。 Cookies 是最安全的选项,允许身份验证与 Angular Universal 一起使用

    3. 令牌随每个 API 调用一起传递。如果您使用 cookie,它们将自动传递。如果使用本地或会话存储,您可以创建 HttpInterceptor 以将令牌添加到请求中。

    4. 然后,API 会在执行操作之前验证令牌是否有效以及用户角色。

    因此,即使您将用户角色存储在客户端,并且如果客户端修改该角色,该操作也不会在 API 端执行,这是最重要的。

    【讨论】:

      【解决方案2】:

      您可以将会话值作为变量存储在堆中。您可以创建一个会话服务来处理会话变量并将其存储在地图中。

      示例项目, https://stackblitz.com/edit/angular-ivy-oq4utv

      使用这种方法,如果用户刷新/重新加载页面,会话值将会丢失,并且您必须在每次页面刷新/重新加载时再次设置所有会话值。

      【讨论】:

        【解决方案3】:

        网络浏览器有 cookie,在 PHP 默认情况下,它会从 PHPSESSID cookie 中跟踪它。

        你可以在这里阅读 https://www.php.net/manual/en/book.session.php 和这里 https://www.php.net/manual/en/session.idpassing.php

        Chrome LocalStorage 和 SessionStorage 是与 PHP 会话无关的本地 HTML5 功能 https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage

        对于您的问题,我认为您可能想错了方向。您希望服务器向客户端提供此类信息,而不是相反。

        如果您使用 Angular 和 API,它应该以 REST 方式工作,并且使用 PHP 会话不是可扩展且可靠的解决方案。 https://en.wikipedia.org/wiki/Representational_state_transfer

        如果您需要验证用户详细信息,客户端应发送服务器可以验证的令牌。如果您希望在客户端缓存用户详细信息,登录后 API 可以返回用户的详细信息,并且可以保存到 HTML5 SessionStorage 中

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-02
          • 1970-01-01
          • 2018-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-05
          相关资源
          最近更新 更多