2016-10-27 4 views
1

У меня есть следующий сценарий:Контроль доступа на основе ролей в приложении Azure API

В Azure есть база данных sql, которая содержит таблицу под названием Contacts. Я могу получить доступ к данным из этой таблицы с помощью самоинсталлированного приложения Java API, которое также размещено на Azure.

Теперь то, что я хочу:

Пользователь с RoleA могут видеть только небольшой набор контактов при вызове API. И пользователь с RoleB может видеть больший набор контактов при использовании API. Я каким-то образом определял бы наборы, к которым могут обращаться пользователи.

Какое место лучше всего реализовать для управления доступом на основе ролей? Can/should I

  1. настроить, что на портале Azure?
  2. Реализуйте это на моем Java-сервере?
  3. создать пользователей для каждой роли в моей базе данных SQL?
+0

'Какое лучшее место для реализации этого управления доступом к ролям?'. Я бы пошел с SQL, первым шагом было бы обращение к таблице, чтобы узнать, имеет ли он правильный доступ. – TheGameiswar

ответ

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 не будет работать напрямую. Схема, описанная выше, приведет к тому, что пользователь, зарегистрированный в веб-приложении, сможет определить, какие строки были возвращены.

+1

Возможно ли реализовать аналогичный пример в Java? Существуют ли библиотеки Java для каждой функции, которую вы используете в демоверсии SQL Security? – unlimited101

+0

Прошу прощения, если я был неясен - приведенные выше команды выполняются в вашей базе данных. Java должен работать нормально - я не верю, что должно быть что-то слишком необычное, чтобы сделать тот же подход на Java, хотя я не пробовал его в последнее время. –