java - 如何根据用户的角色过滤 SQL 行?

标签 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-Resource http://api:8080/Application/Contracts/getAll 数据(未经权限检查)可以简单地是:

SELECT Contract.* FROM Contract

但是 Anne 只能看到 147 和 148。Mike 可以看到 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 和连接池。

最佳答案

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

如果您想要更快的 SQL 查询(不需要联接),您可以基于该查询创建一个物化 View ,但不使用 WHERE 子句,并在列选择上使用 User

SELECT User, Contract.* FROM Contract
INNER JOIN Company ON Contract.CompanyName = Company.Name
INNER JOIN Role ON Role.Role = Company.Role

这样,您将拥有一个虚拟表,可以保存该查询并使其保持最新状态,以便快速检索身份验证数据。要选择,您只需要:

SELECT * FROM MaterializedView
WHERE User = @CurrentlyAuthenticatedUser

关于java - 如何根据用户的角色过滤 SQL 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629173/

相关文章:

java - 如何识别 6 个月前的完整日期

mysql - max_allowed_pa​​cket 考虑了什么?

mysql - 各大洲平均人口

spring - 使用 Jersey 的 RESTful Web 服务的 session 管理

java - Android 和 json 使用嵌套对象的 REST 服务中的 gson

rest - header 中的 Camel REST 路径参数 - 安全问题?

java - 在Android上执行长CPU进程时渲染opengl es

java - 在 Spark JavaRDD 转换中使用可序列化的 lambda

java - 如何在Java中流畅地解析和遍历JSON对象

sql - 使用 SQL 从另一个表中提取附件 (Access 2010)?