用PHP和Javascript实现用户授权

用PHP和Javascript实现用户授权,php,javascript,authorization,Php,Javascript,Authorization,假设我有一个有效的会话和一个经过身份验证的用户,那么在一个具有PHP/MySQL后端和大量JavaScript前端的应用程序中实现用户授权有哪些方法 我能找到的大多数实现示例似乎都过于关注用户身份验证,而授权只是发生了一些事情。例如,if语句检查用户类型是否为admin。这对我来说太实际了 在像我这样的实现中,无法知道用户在发起请求时处于什么“页面”上。因此,由PHP确定的只为特定用户提供特定内容的方法对于我需要做的事情来说太广泛了 理想情况下,每个实体都有一种访问控制列表,该列表基于用户或用户

假设我有一个有效的会话和一个经过身份验证的用户,那么在一个具有PHP/MySQL后端和大量JavaScript前端的应用程序中实现用户授权有哪些方法

我能找到的大多数实现示例似乎都过于关注用户身份验证,而授权只是发生了一些事情。例如,if语句检查用户类型是否为admin。这对我来说太实际了

在像我这样的实现中,无法知道用户在发起请求时处于什么“页面”上。因此,由PHP确定的只为特定用户提供特定内容的方法对于我需要做的事情来说太广泛了

理想情况下,每个实体都有一种访问控制列表,该列表基于用户或用户所在的组或类型

我去了当地的一家书店,花了一个下午浏览了他们所有关于PHP、MySQL和JavaScript的内容。令人惊讶的是,大多数书籍几乎没有关于用户授权的内容。那吓死我了!任何使用AJAX构建大型web应用程序的人都必须解决这一问题,我似乎找不到什么东西可以让我开始


我非常感谢所有的反馈、经验、提示等(有关于这个主题的书吗?

这就是我所理解的:

你需要为你的用户建立一个访问控制列表吗?你…吗? [如果我错了,请纠正我]


我建议您创建一个DB表,您可以在其中存储用户ID(或用户名)以及它对Web应用程序的访问类型。然后,您可以检查该表,以了解该用户是否可以访问请求的URL/资源。仅此而已。

您似乎正在寻找一种称为访问控制列表(又称ACL)的东西(根据Zed Shaw,great video)

在不知道自己拥有哪种后端的情况下,很难为您提供解决方案,但您可能会了解其他人是如何做到这一点的


有关Limition framework(PHP)的特定内容,请参阅:

PHP安全性似乎陷入了一个黑暗时代:单一密码为一个用户提供一个特定页面类的令牌。你似乎想在你的应用程序中获得更多的细粒度,甚至可能允许根据登录令牌访问特定的资源。您对访问控制列表的想法是绝对正确的,是的,您已经发现了一个秘密:没有人真正发布了如何设计或编写ACL机制。尽管如此,它已经完成了

首先,你熟悉吗?这些是您在命令行上的
ls-l
中看到的
-rwxr-xr-x
内容。Unix选择了一种非常简化的ACL方法。每个登录的人都有一个用户ID(UID)和一个或多个组ID(GID)(
whoami
groups
)。Unix文件权限允许三种操作,
读取
写入
、和
执行
,它们可以打开或关闭。有了2^^9个状态,这些权限就可以轻松地放入一个整数中,然后Unix就可以附加这个整数了 直接在文件系统中为文件添加整数。当用户尝试访问文件时,权限将从严格权限与允许权限进行比较,以匹配允许的最大权限。因此,用户获得第一组权限,组获得第二组权限,任何人都获得第三组权限。因此,可执行文件通常是755:只有所有者可以更改它,但任何人都可以读取和使用它

第二,LDAP是轻量级目录访问协议,该系统旨在让多个网络用户访问资源。OpenLDAP是一种常见的Linux实现,Microsoft在Windows服务器上的Active Directory使用LDAP(带有许多扩展)。LDAP有一个更加健壮的ACL系统。一般配置是由[who][授予的访问类型][控制]
访问[资源],或由*none
访问dn=“uid=matt,ou=Users,dc=example,dc=com”,以限制对matt用户信息的所有访问。对于更完整的讨论,我强烈推荐,特别是关于安全性的第4章。(这是我从我的直接知识中得到的一些信息。)我的印象是LDAP将这些信息存储在一个单独的数据库表中,但我不知道这一点,也无法以这种或那种方式找到文档。我正在密切关注这方面的可能模式

总结一下:ACL采用了一个用户令牌的概念,其中可能包含用户级别以上的组、一组要以某种方式保护的对象,以及对这些部分的几个一致的可能操作—3维信息。Unix存储了其中两个维度,并直接对其进行保护。OpenLDAP分别存储这三个维度,在某种程度上我们不太清楚,但我怀疑这是一个链接树结构

让我们来看看如何设计一个ACL系统,用于一个REST Web应用程序。对于假设,我们将把您的应用程序分解为离散的可寻址单元—每个需要保护的东西都可以通过URI(

http://example.com/users
http://example.com/page_pieces/ticker
)。我们的用户将是一个简单的UID/GIDs令牌-一个用户可以是多个组的一部分。最后,我们的可用操作将基于HTTP请求—GET、POST、PUT、DELETE等。我们现在需要一个能够有效处理三维数据数组的系统。我们的模式应该非常明显:
(uri、userid、groupid、operations)
。我们故意将
操作
列反规范化为
GET,POST,…
的字符串列表,因此我们只需要一个表。没有主键,因为我们永远不会真正地通过ID查找

查询将分两步完成:
从acl中选择*,其中uri=@uri,userid=@userid
将返回0或1行。如果它返回1行,我们就完成了,可以grep
permission
查看操作是否在列表中(我们)