基于角色的实体行级权限

本文关键字:实体 权限 于角色 角色 | 更新日期: 2023-09-27 18:03:29

使用基于角色的权限,假设表中的每一行代表一个实体,例如Products表,每一行代表一个Product实体。

如何提供基于角色的产品级安全性?

。Sales组可以访问ID为1,234,432,532,34的Products

多个角色可以被赋予对任何给定产品的权限。

目标是为如下查询提供一个有效的数据库调用:
var products = ProductDao.GetProductsByRole(234);  // roleID = 234

基于角色的实体行级权限

多对多关系存储在单独的表中:

create table Products( 
    ProductId int not null identity (1,1),
    Name nvarchar(256) not null,
    Description nvarchar(max),
    constraint PK_Products primary key (ProductId),
    constraint UNQ_Products_Name unique (Name));
create table Roles(
    RoleId int not null identity (1,1),
    Name nvarchar(256) not null,
    Description nvarchar(max),
    constraint PK_Roles primary key (RoleId),
    constraint UNQ_Roles_Name unique (Name));
go
create table ProductRolePermissions (
    ProductId int not null,
    RoleId int not null,
    constraint FK_ProductRolePermissions_Products
        foreign key (ProductId) 
        references Products(ProductId),
    constraint FK_ProductRolePermissions_roles
        foreign key (RoleId) 
        references Roles(RoleId));
go
create unique clustered index CDX_ProductRolePermissions 
   on ProductRolePermissions (RoleId, ProductId);
create unique nonclustered index NDX_ProductRolePermissions 
   on ProductRolePermissions (ProductId, RoleId);
go

create function dbo.GetProductsByRole( @roleId int)
returns table
with schemabinding
as return (
    select ProductId 
    from dbo.ProductRolePermissions
    where RoleId = @roleId);
go

insert into Products (Name) 
       values ('P1'), ('P2'), ('P3'), ('P4');
insert into Roles (Name) 
       values ('G1'), ('G2');
insert into ProductRolePermissions (ProductId, RoleId) 
       values (1,1), (3,1), (2,2), (3,2);
go
select 'Products permitted for G1', p.* 
from dbo.GetProductsByRole(1) r
join Products p on r.ProductId = p.ProductId;
select 'Products permitted for G2', p.* 
from dbo.GetProductsByRole(2) r
join Products p on r.ProductId = p.ProductId;

如果您想遵循具有多角色成员关系的读/写/完全访问的经典授予/拒绝/撤销权限模型,事情会变得有点复杂。