热词: RFID传感器二维条码生物识别卫星导航定位


当前位置:首页 > 网络层 > 技术 > 访问控制

基于角色的访问控制RBAC的mysql表设计

2017-06-09 来源:我爱物联网

基于角色的访问控制RBAC的mysql表设计

一、用户角色表,用于存储角色id和角色名称,表结构如下:

create table roles(role_id int unsigned not null auto_increment,role_name varchar(50) not null,primary key (role_id));二、权限表,存储权限id和权限描述,表结构如下:

create table permissions(perm_id int unsigned not null auto_increment,perm_desc varchar(50) not null,primary key (perm_id));三、角色与权限关联表,用于存储角色id和权限id的关联关系,结构如下:

create table role_perm(role_id int unsigned not null,perm_id int unsigned not null);四、用户与角色关联表,用于存储用户id和角色id的对应关系,结构如下:

create table user_role(user_id int unsigned not null,role_id int unsigned not null);

通过这样的表设计,可以添加任意个角色和权限。同时,用户可以有一个或多个角色,逻辑代码就不贴出来了。


操作系统学习之访问控制

1 访问控制

计算机安全领域中,访问控制就是对不同的用户提供不同的资源访问权限,即不同用户对不同资源的操作能力不同。

访问控制矩阵是计算机系统中的许可的静态描述,用于为用户和文件分配不同级别的安全性。在访问控制矩阵中,系统可能需要访问的任何东西,如文件,一块硬件或进程,被称为一个对象。像用户进程和其他可能需要访问的文件之类的主体有不同的访问能力(如读,写,读写),称为权限。矩阵列出沿着一个轴的对象和沿着另一个轴的对象,以提供关于分配给不同主题的变化权利的信息。

2 访问控制矩阵实现方式基于行的方式 即将访问权限绑定到主体上,主体对于客体拥有不同权限。Capability基于此种方式实现。例如seL4。基于列的方式 对于特定的客体,记录不同主体对其的访问权限。ACL(Access Control List)基于此种方式实现。例如Linux。

C++之 虚函数的访问控制 以及 编译器的绑定策略

[updated] 注意:基类的指针不能调用派生类自己定义的函数,只能调用虚函数!!!!因为函数的绑定是静态的,实际调用的函数才是动态的。

如下面的代码:

这里文章的题目是自拟的,只因为自己发现虚函数的访问控制,与自己之前的理解有出入,于是备忘之。

首先,虚函数是实现多态的机制,也就是说在利用基类的指针或者引用调用虚函数时,调用的是该指针或者引用的动态类型的相应的函数,这里有几点需要备忘的。

1 编译器在决定调用函数时,如果该函数是虚函数才会在运行时确定调用什么函数,如果不是虚函数,那么在编译阶段就已经确定了调用的函数类型,如下面的代码;

基类与派生类都声明了函数f。但是在main函数的调用中编译器调用的是静态类型对应的函数,因为f函数并不是虚函数,虽然在基类与派生类中都声明了该函数。

这是显然的,没有虚函数,就没有多态了,也就无所谓动态类型了。函数的所有调用都是静态绑定。

2 基类定义虚函数为public,派生类覆盖了该虚函数,但是将其声明为private,这样当基类的指针绑定到派生类的对象时,使用该基类指针调用该虚函数时,调用是否成功。如果二者的访问权限反过来呢。

class Base{public: virtual void f(int i=0) {cout << "f() in Base..." << i << endl;}};class Derived:public Base{private: void f(int i=1){cout << "f() in derived..." << i << endl;}};int main(void){ Base *b = new Derived(); b->f(); return 0;}上述代码的输出为: f() in derived 0

首先分析,为什么输出结果是f() in derived. 编译器在看到b对f进行调用时,此时编译器根据b的静态类型(也就是Base)来决定f函数是否可访问,由于f函数式public的,OK, "访问控制为public"并没有影响调用,并且进行形参的默认参数的赋值。

由于f是虚函数,那么具体调用哪个函数是在运行时确定的,于是,在运行时查找Derived的虚函数表,得到虚函数f(此时的f已经被Derived类覆盖,于是调用的就是派生类的版本。)

至于,为什么i的值为0,上述分析也已经说明了,也可以参见文章

如果将两者的访问权限交换,那么访问控制这一关都过不了,其实很简单,既然你需要派生类继承f函数,将其在Base类中声明为private本身就是不对的。

相关热点