php 用户授权,在PHP和Javascript中实现用户授权

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

首先,你熟悉unix file permissions吗?你在命令行的ls -l中看到的是-rwxr-xr-x. Unix选择了一种非常简化的ACL方法.每个登录的人都有一个用户ID(UID)和一个或多个组ID(GID)(whoami,组). Unix文件权限允许三个操作,Read,Write和Execute,它们可以打开或关闭.有2 ^^ 9个状态,这些权限很容易适合整数,然后Unix可以附加它

直接在文件系统中的文件整数.当用户尝试访问文件时,权限将从严格到允许进行比较,匹配允许的最宽松权限.因此,用户获得第一组权限,组获得第二组,任何人获得第三组权限.因此,可执行文件通常是755:只有所有者可以更改它,但任何人都可以阅读和使用它.

其次,LDAP是轻量级目录访问协议,旨在为多个网络用户提供对资源的访问. OpenLDAP是一种常见的Linux实现,而Windows Server上的Microsoft的Active Directory会说LDAP(有很多扩展). LDAP具有更强大的ACL系统.一般配置是通过[who] [授予的访问类型] [控制]访问[资源]或访问dn =“uid = matt,ou = Users,dc = example,dc = com”by * none以限制所有访问Matt的用户信息.对于更完整的讨论,我强烈推荐Mastering LDAP,特别是关于安全性的第4章. (这是我从我的直接知识中得到的一点.)我的印象是LDAP将这些信息存储在一个单独的数据库表中,但我不知道,也无法以这种或那种方式找到文档.我正在密切关注可能的架构.

简要总结一下:ACL采用用户令牌的概念,其中包含用户级别以上的可能组,以某种方式保护的对象集合,以及对这些部分的三个一致的可能操作 – 信息的3个维度. Unix存储其中两个维度,直接保护事物. OpenLDAP分别存储这三个维度,我们不太了解,但我怀疑是一个链接的树结构.

鉴于此,我们来看看如何为RESTful Web应用程序设计ACL系统.对于假设,我们会将您的应用程序分解为离散的可寻址单元 – 每个需要保护的东西都可以通过URI访问(http://example.com/users,http://example.com/page_pieces/ticker).我们的用户将是一个简单的UID / GID令牌 – 用户可以成为多个群组的一部分.最后,我们的可用操作将基于HTTP请求-GET,POST,PUT,DELETE等.我们现在需要一个能够有效处理三维数据数组的系统.我们的架构应该非常明显:( uri,userid,groupid,operations).我们故意将操作列反规范化为GET,POST,…的字符串列表,所以我们只需要一个表.没有主键,因为我们永远不会真正通过ID查找.

查询将分两步完成:SELECT * FROM acl WHERE uri = @ uri,userid = @ userid将返回0或1行.如果它返回1行,我们就完成了并且可以grep permisssion以查看操作是否在列表中(使用*表示所有perms).如果我们得到0行,则运行第二个查询SELECT * FROM acl WHERE uri = @ uri,userid =’*’,groupid in(@groupid),它将再次返回0或某些行.如果它返回一些,循环并查看perms.如果它返回0,则执行最后一个查询SELECT * FROM acl WHERE uri = @ uri,userid =’*’,groupid =’*’,它最终将返回0或1行.如果它返回1,请查看perms.如果返回0,则采取默认操作.

我们可以通过多种方式设置权限:

> INSERT INTO acl VALUES(@ uri,@ userid,”,’GET,POST’)允许单个用户GET或POST访问

>插入acl VALUES(@ uri,’*’,’admin,contributors’,’GET,PUT,POST,DELETE’)

> INSERT INTO acl VALUES(@ uri,’*’,’*’,”)拒绝所有访问.

有几点需要注意:

>必须准确表达所有URI;这个解决方案无法设置更高级别的默认权限并让它们逐渐减少(作为对提问者的练习).> uri / uid / gid对的唯一性应该在某个时刻发生.应用程序可以处理它,或者在MySQL中,您可以执行ALTER TABLE acl ADD UNIQUE INDEX(uri,userid,groupid)(查找其他DBMS中类似约束的文档).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值