Azure API App

时间:2016-10-27 12:30:47

标签: api azure azure-sql-database rbac

我有以下情况:

Azure中有一个sql数据库,其中包含一个名为Contacts的表。我可以使用自行实现的Java API应用程序访问此表中的数据,该应用程序也托管在Azure上。

现在我想要的是什么:

具有RoleA的用户在调用API时只能看到一小组Contacts。使用API​​时,具有RoleB的用户可以看到更大的联系人集。我会以某种方式定义用户可以访问的集合。

实施此基于角色的访问控制的最佳位置是什么?可以/我应该

  1. 在Azure门户中配置它?
  2. 在我的Java后端实现这个?
  3. 为我的SQL数据库中的每个角色创建用户?

1 个答案:

答案 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 

我对您的表命名进行了一些猜测,以及如何命名映射表。

Azure SQL Security Demo

中有类似的实现

回答你的想法:我不认为1会起作用,2会工作得很好但是依赖于APP更新来改变映射,3不会直接工作。我上面描述的大纲将使登录到Web应用程序的用户能够确定返回了哪些行。