【问题标题】:Role-based access control in Azure API AppAzure API 应用中基于角色的访问控制
【发布时间】:2016-10-27 12:30:46
【问题描述】:

我有以下场景:

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

现在我想要什么:

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

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

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

【问题讨论】:

  • What is the best place to implement this Role-bases access control?..我会用SQL,第一步是访问表,看看他是否有权限

标签: api azure azure-sql-database rbac


【解决方案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 应用程序的用户能够确定返回了哪些行。

【讨论】:

  • 是否可以用Java实现类似的例子?您在 SQL 安全演示中使用的每个函数都有 Java 库吗?
  • 如果我不清楚,我很抱歉 - 上述命令是在您的数据库上执行的。 Java 应该可以正常工作——我认为在 Java 上做同样的方法不应该有任何不寻常的东西——尽管我最近没有尝试过。
猜你喜欢
  • 2020-02-06
  • 2010-09-11
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多