4.6.2 角色
考虑在一个大学里不同人所具有的真实世界角色。每个教师必须在同一组关系上具有同种类型的权限。
方式1
单独给每一个新的教师授予所有这些权限.
方式2
一种更好的方式是
- 指明所有教师应该被授予的权限,
- 并单独标示出哪些数据库用户是教师。
系统可以利用这两条信息来确定每位教师的权限。当雇佣了一位新的教师时,必须给他分配一个用户标识符,并且必须将他标示为一位教师,而不需要重新单独授予教师权限。
角色
角色(role
)的概念适用于此观念。在数据库中建立一个角色集
,可以给角色授予权限,就和给每个用户授权的方式完全一样。每个数据库用户被授予一组他有权扮演的角色(也可能是空的)。
在我们的大学数据库里,角色的例子可以包括instructor
、 teaching_assistant
、 student
、dean
和department_chair
。
方式3
另一个不是很合适的方法是建立一个instructor
用户标识,允许每位教师用instructor
用户标识来连接数据库。该方式的问题是它不可能鉴别出到底是哪位教师执行了数据库更新,从而导致安全隐患。使用角色的好处是需要用户用他们自己的用户标识来连接数据库。
如何创建角色
任何可以授予给用户的权限都可以授予给角色。给用户授予角色就跟给用户授权一样。
在SQL
中创建角色如下所示:
1 | create role instructor; |
然后角色就可以像用户那样被授予权限,如在这样的语句中:
1 | grant select |
1 | mysql> create role instructor; |
角色可以授予用户 角色可以授予其他角色
角色可以授予给用户,也可以授予给其他角色,如这样的语句:
1 | create role dean; |
一个用户或角色拥有的权限
因此,一个用户或一个角色的拥有的权限包括:
- 所有
直接授予
该用户或该角色的权限。 - 其他
角色授予
给该用户或该角色的权限。
角色链 后面角色继承得到前面角色的权限
注意可能存在着一个角色链;例如,
- 角色
teaching_assistant
可能被授予所有的角色instructor
。 - 接着,角色
instructor
被授予所有的角色dean
。
这样,角色dean
就继承了所有被授予给角色instructor
和teaching_assistant
的权限,还包括直接赋给dean
的权限。
当一个用户登录到数据库系统时,在此会话中用户执行的动作拥有所有直接授予该用户的权限,以及所有(直接地或通过其他角色间接地)授予该用户所拥有角色的权限。
这样,如果一个用户Amit
被授予了角色dean
,用户Amit
就拥有所有直接授予给Amit
的权限,以及授予给dean
的权限,再加上授予给instructor
和teaching_assistant
的权限.
SQL
标准中没有基于角色的授权概念
值得注意的是,基于角色的授权概念并没有在SQL
中指定,但在很多的共享应用中,基于角色的授权被广泛应用于存取控制。
原文链接: 4.6.2 角色