基于角色的实体的行级权限

时间:2011-07-26 18:04:37

标签: c# asp.net sql-server

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

您如何根据角色提供产品级安全性?

e.g。销售组可以访问ID为1,234,432,532,34

的产品

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

目标是为以下查询提供有效的数据库调用:

var products = ProductDao.GetProductsByRole(234);  // roleID = 234

1 个答案:

答案 0 :(得分:2)

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

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;

如果您希望遵循经典的grant / deny / revoke权限模型以获得具有多个角色成员身份的读/写/完全访问权限,那么事情会变得复杂一些。