我有以下情况:
Azure中有一个sql数据库,其中包含一个名为Contacts的表。我可以使用自行实现的Java API应用程序访问此表中的数据,该应用程序也托管在Azure上。
现在我想要的是什么:
具有RoleA的用户在调用API时只能看到一小组Contacts。使用API时,具有RoleB的用户可以看到更大的联系人集。我会以某种方式定义用户可以访问的集合。
实施此基于角色的访问控制的最佳位置是什么?可以/我应该
答案 0 :(得分:1)
您应该使用Row level security获得完全相同的行为。
你可以:
1。)将任何/所有联系人映射到您应用的用户。 (您可以决定在辅助表中最简单。)
2.。)实现一个谓词,用于检查哪个用户登录到了应用程序。
CREATE FUNCTION Security.contactAccessPredicate(@ContactID int)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS isAccessible
FROM dbo.ApplicationUserContacts --a mapping table
WHERE
(
-- application users can access only patients assigned to them
Contact_ContactID = @ContactID
AND ApplicationUser_Id = CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(128))
)
OR
(
-- DBAs can access all contacts
IS_MEMBER('db_owner') = 1
)
go
3.)将该谓词绑定到您的模式。
CREATE SECURITY POLICY Security.contactSecurityPolicy
ADD FILTER PREDICATE Security.contactAccessPredicate(PatientID) ON dbo.Contacts,
ADD BLOCK PREDICATE Security.contactAccessPredicate(PatientID) ON dbo.Contacts
go
我对您的表命名进行了一些猜测,以及如何命名映射表。
中有类似的实现回答你的想法:我不认为1会起作用,2会工作得很好但是依赖于APP更新来改变映射,3不会直接工作。我上面描述的大纲将使登录到Web应用程序的用户能够确定返回了哪些行。