访问授权(Authorization)
最灵活的保护你应用数据安全的方式是通过访问控制列表(Access Control List),通常简称为「ACL 机制」。ACL 背后的机制是将每个操作授权给一部分 用户(User)或者 角色(Role),只允许这些用户或角色执行这些操作。例如,一个用户必须拥有读权限(或者属于一个拥有读权限的角色)才可以获取一个对象的数据,同时,一个用户需要拥有写权限(或者属于一个拥有写权限的角色)才可以更改或者删除一个对象。
+
ACL 工作的前提是用户(User)和角色(Role)。用户(类名_User
)是 LeanCloud 内建的账户系统,自动支持用户注册、登录、验证等操作,详细内容请参考用户系统。角色(类名_Role
)是一种有名称的对象,包含了用户和其他角色(也就是说角色也有层次关系),将权限授予一个角色代表该角色所包含的其他角色也会得到相应的权限。
ACL一般分为对CLass、Object级别的授权,就不再细细展开
角色
当你的 app 的规模和用户基数成长时,你可能发现你需要比 ACL 模型(针对每个用户)更加粗粒度的访问控制你的数据的方法。为了适应这种需求,需提供支持一种基于角色的权限控制方式。角色系统提供一种逻辑方法让你通过权限的方式来访问你的数据,角色是一种有名称的对象,包含了用户和其他角色。任何授予一个角色的权限隐含着授予它包含着的其他的角色相应的权限。
+
例如,在你的 app 中管理着一些内容,你可能有一些类似于「主持人」的角色可以修改和删除其他用户创建的新的内容,你可能还有一些「管理员」有着与「主持人」相同的权限,但是还可以修改 app 的其他全局性设置。通过给予用户这些角色,你可以保证新的用户可以做主持人或者管理员,不需要手动地授予每个资源的权限给各个用户。
+
我们提供一个特殊的角色(Role)类来表示这些用户组,为了设置权限用。角色有一些和其他对象不太一样的特殊字段。
+
字段 | 说明 |
---|---|
name | 角色的名字,这个值是必须的,而且只允许被设置一次,只要这个角色被创建了的话。角色的名字必须由字母、空格、减号或者下划线这些字符构成。这个名字可以用来标明角色而不需要它的 objectId。 |
users | 一个指向一系列用户的关系,这些用户会继承角色的权限。 |
roles | 一个指向一系列子角色的关系,这些子关系会继承父角色所有的权限。 |
通常来说,为了保持这些角色安全,你的移动 app 不应该为角色的创建和管理负责。作为替代,角色应该是通过一个不同的网页上的界面来管理,或者手工被管理员所管理。
更安全的鉴权方式
一种新的 API 鉴权方式,即在 HTTP header 中使用 X-LC-Sign 来代替 X-LC-Key,以降低 App Key 的泄露风险。例如:
curl -X PUT \
-H "X-LC-Id: FFnN2hso42Wego3pWq4X5qlu" \
-H "X-LC-Sign: d5bcbb897e19b2f6633c716dfdfaf9be,1453014943466" \
-H "Content-Type: application/json" \
-d '{"content": "在 HTTP header 中使用 X-LC-Sign 来更新一篇博客的内容"}' \
https://m6wlxaf8.api.lncld.net/1.1/classes/Post/<objectId>
X-LC-Sign 的值是由 sign,timestamp[,master]
组成的字符串:
+
取值 | 约束 | 描述 |
---|---|---|
sign | 必须 | 将 timestamp 加上 App Key 或 Master Key 组成的字符串,再对它做 MD5 签名后的结果。 |
timestamp | 必须 | 客户端产生本次请求的 unix 时间戳(UTC),精确到毫秒。 |
master | 可选 | 字符串 "master" ,当使用 master key 签名请求的时候,必须加上这个后缀明确说明是使用 master key。 |
举例来说,假设应用的信息如下:
+
App Id | FFnN2hso42Wego3pWq4X5qlu |
App Key | UtOCzqb67d3sN12Kts4URwy8 |
Master Key | DyJegPlemooo4X1tg94gQkw1 |
请求时间 | 2016-01-17 15:15:43.466 |
timestamp | 1453014943466 |
使用 App Key 来计算 sign:
md5( timestamp + App Key )
= md5(1453014943466UtOCzqb67d3sN12Kts4URwy8
)
= d5bcbb897e19b2f6633c716dfdfaf9be+
-H "X-LC-Sign: d5bcbb897e19b2f6633c716dfdfaf9be,1453014943466" \
使用 Master Key 来计算 sign:
+
md5( timestamp + Master Key )
= md5(1453014943466DyJegPlemooo4X1tg94gQkw1
)
= e074720658078c898aa0d4b1b82bdf4b+
-H "X-LC-Sign: e074720658078c898aa0d4b1b82bdf4b,1453014943466,master" \
+
(最后加上 master 来告诉服务器这个签名是使用 master key 生成的。)
+
使用 master key 将绕过所有权限校验,应该确保只在可控环境中使用,比如自行开发的管理平台,并且要完全避免泄露。因此,以上两种计算 sign 的方法可以根据实际情况来选择一种使用。