如何在Angular中生成服务器端会话变量?

3

我刚刚完成了一个小的hack,针对我的angular应用程序。首先,我有一个带有PUBLIC、MEMBER、ADMIN权限访问角色的菜单导航列表。登录后,我将用户的角色存储为“MEMBER”,他可以查看PUBLIC和MEMBER链接。(使用Chrome)但后来我打开了

开发者工具 > 应用程序 > 存储 > 会话存储

并将'member'变量从"MEMBER"更改为"ADMIN",然后我就可以查看秘密管理员链接。

这不是一个关于编码结构的问题,而是“如何以安全的方式存储会话变量”的问题。在此之前,我认为PHP的会话变量相当于“会话存储”,但社区说SESSION不能被用户更改 https://dev59.com/XVnUa4cB1Zd3GeqPedgu#6912409

那么,现在我了解到,有两种类型的SESSION,即服务器端和客户端SESSION。对于一个标准的angular应用程序,最好的存储“email”、“role”之类的处理方式是什么,而且不能被用户修改?我需要将它们存储在会话中的原因是它们可以很容易地被调用出来。

Role - Show/Hide navigation menu items
Email - to perform SQL filter, SELECT fields FROM Record WHERE email=Session.Email

感谢您的建议。
3个回答

3

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

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

  1. 当您使用API登录时,API将生成一个安全令牌,并在成功认证后将其发送到客户端。该安全令牌已加密并可以包含任何信息,如用户ID和角色。

  2. 然后将该令牌存储在浏览器中(可以是本地存储、会话存储或cookie)。Cookie是最安全的选项,可以让身份验证与Angular Universal一起工作。

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

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

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


0

网页浏览器有cookies,PHP默认从PHPSESSID cookie跟踪它。

您可以在此处阅读 https://www.php.net/manual/zh/book.session.php 和在这里 https://www.php.net/manual/zh/session.idpassing.php

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

针对您的问题,我认为您可能反过来思考了。您希望服务器向客户端提供此类信息,而不是相反。

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

如果需要验证用户详细信息,客户端应该发送一个令牌,服务器可以验证。如果您想在客户端上缓存用户详细信息,在登录后API可以返回用户是谁的详细信息,并将其保存在HTML5 SessionStorage中。

0
你可以将会话值存储在堆中作为变量。您可以创建一个会话服务,它将负责会话变量并将其存储在Map中。
示例项目, https://stackblitz.com/edit/angular-ivy-oq4utv 采用这种方法,如果用户刷新/重新加载页面,则会丢失会话值,并且每次页面刷新/重新加载都需要重新设置所有会话值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接