4.6.2 角色

4.6.2 角色

考虑在一个大学里不同人所具有的真实世界角色。每个教师必须在同一组关系上具有同种类型的权限。

方式1

单独给每一个新的教师授予所有这些权限.

方式2

一种更好的方式是

  • 指明所有教师应该被授予的权限,
  • 并单独标示出哪些数据库用户是教师。

系统可以利用这两条信息来确定每位教师的权限。当雇佣了一位新的教师时,必须给他分配一个用户标识符,并且必须将他标示为一位教师,而不需要重新单独授予教师权限。

角色

角色(role)的概念适用于此观念。在数据库中建立一个角色集,可以给角色授予权限,就和给每个用户授权的方式完全一样。每个数据库用户被授予一组他有权扮演的角色(也可能是空的)。

在我们的大学数据库里,角色的例子可以包括instructorteaching_assistantstudentdeandepartment_chair

方式3

另一个不是很合适的方法是建立一个instructor用户标识,允许每位教师用instructor用户标识来连接数据库。该方式的问题是它不可能鉴别出到底是哪位教师执行了数据库更新,从而导致安全隐患。使用角色的好处是需要用户用他们自己的用户标识来连接数据库。

如何创建角色

任何可以授予给用户的权限都可以授予给角色。给用户授予角色就跟给用户授权一样。
SQL中创建角色如下所示:

1
create role instructor;

然后角色就可以像用户那样被授予权限,如在这样的语句中:

1
2
3
grant select
on takes
to instructor;
1
2
3
4
5
6
7
mysql> create role instructor;
Query OK, 0 rows affected (0.02 sec)

mysql> grant select
on takes
to instructor;
Query OK, 0 rows affected (0.02 sec);

角色可以授予用户 角色可以授予其他角色

角色可以授予给用户,也可以授予给其他角色,如这样的语句:

1
2
3
4
5
6
7
create role dean;
grant dean
to Amit;
grant instructor
to deangrant;
grant dean
to Satoshi;

一个用户或角色拥有的权限

因此,一个用户或一个角色的拥有的权限包括:

  • 所有直接授予该用户或该角色的权限。
  • 其他角色授予给该用户或该角色的权限。

角色链 后面角色继承得到前面角色的权限

注意可能存在着一个角色链;例如,

  • 角色teaching_assistant可能被授予所有的角色instructor
  • 接着,角色instructor被授予所有的角色dean

这样,角色dean就继承了所有被授予给角色instructorteaching_assistant的权限,还包括直接赋给dean的权限。

当一个用户登录到数据库系统时,在此会话中用户执行的动作拥有所有直接授予该用户的权限,以及所有(直接地或通过其他角色间接地)授予该用户所拥有角色的权限。

这样,如果一个用户Amit被授予了角色dean,用户Amit就拥有所有直接授予给Amit的权限,以及授予给dean的权限,再加上授予给instructorteaching_assistant的权限.

SQL标准中没有基于角色的授权概念

值得注意的是,基于角色的授权概念并没有在SQL中指定,但在很多的共享应用中,基于角色的授权被广泛应用于存取控制。