我有以下情况:
Azure中有一个sql数据库,其中包含一个名为Contact的表。我可以使用一个自实现的Java访问这个表中的数据,这个应用程序也托管在Azure上。
我想要的是:
使用RoleA的用户在调用API时只能看到一小部分联系人。使用RoleB的用户在使用API时可以看到更大的联系人集。我会以某种方式定义用户可以访问的集合。
实现此角色基础访问控制的最佳位置是什么?我能/应该
发布于 2016-10-27 17:38:59
您应该通过使用行级安全性来获得正确的行为。
您可以:
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 我对您的表命名和如何命名映射表进行了一些猜测。
在Azure SQL安全性演示中有一个类似的实现
要回答你的想法:我不认为1会工作,2会很好,虽然将依赖于应用程序更新来改变映射,而3将不会直接工作。我上面描述的大纲将让登录到web应用程序的用户能够确定哪些行被返回。
https://stackoverflow.com/questions/40284644
复制相似问题