如何过滤SQL行,具体取决于用户的角色?

时间:2016-06-04 10:37:03

标签: java sql rest authorization

在我的应用程序中,每个用户都可以拥有多个授权角色。根据他的角色,应允许用户查看某些数据摘录。我想通过REST-API从我的关系数据库中提供这些数据。

例如:

table "Role"
UserName | Role
---------------------------
Anne     | ViewFreshFruits
Mike     | ViewFreshFruits
Mike     | ViewTinySoft

table "Company"
Name        | Address     | Role
--------------------------------------------
FreshFruits | 123 America | ViewFreshFruits 
TinySoft    | 543 Britain | ViewTinySoft

table "Contract"
ID  | CompanyName | Dollar
---------------------------
147 | FreshFruits | 15549
148 | FreshFruits | 16321
149 | TinySoft    | 2311

要实现REST资源http://api:8080/Application/Contracts/getAll,数据(未经许可检查)可能只是:

SELECT Contract.* FROM Contract

但安妮只被允许看到147和148.迈克可以看到147,148,149。而且Tomy一定不会得到任何结果。

我开始像这样实施权限检查:

SELECT Contract.* FROM Contract
INNER JOIN Company ON Contract.CompanyName = Company.Name
INNER JOIN Role ON Role.Role = Company.Role
WHERE User = @CurrentlyAuthenticatedUser

这种SQL会因数据库中的表数而增加复杂性。我正在寻找一种更简单的方法:更简单,更易于维护。表现不是我主要关注的问题。

如何根据用户过滤某些数据行尽可能简单?

我正在使用Microsoft SQL Server 2012,Java Tomcat 8和连接池。

2 个答案:

答案 0 :(得分:0)

传递角色的存储过程如何?或者为了简化您的选择,请使用视图隐藏一些细节。

修改

创建公司和授权表(或存储过程或CTE)的视图

CREATE VIEW CompanySecurity AS SELECT Company.*, role.username FROM Company INNER JOIN Role ON Role.Role = Company.Role

如果您想要合约详细信息,请将该视图加入CompanySecurity并过滤用户名

如果您想查看销售,请将销售加入CompanySecurity并过滤用户名

答案 1 :(得分:0)

这似乎是最简单的创建和维护方式。

如果您想要更快的SQL查询(不需要连接),您可以根据该查询创建实体化视图,但不能使用assertMethodCalled子句和WHERE列选择。

User

通过这种方式,您将拥有一个虚拟表,可以保存该查询并保持最新的快速身份验证数据检索。要SELECT User, Contract.* FROM Contract INNER JOIN Company ON Contract.CompanyName = Company.Name INNER JOIN Role ON Role.Role = Company.Role ,你只需要:

select