2013-10-07 6 views
6

Чтобы регистрировать использование приложения, которое я разрабатываю, мне нужно, чтобы каждый пользователь, используя мое приложение, выполнял запросы к моей базе данных SQL Server под своими учетными данными.Как предоставить разрешение IMPERSONATE любому другому пользователю?

Чтобы не быть хранят свои пароли в извлекаемой моде, я не могу создавать соединение на основе каждого пользователя (потому что повлекло бы за собой, зная свой пароль мимо короткого окна при входе в).

Очевидно, что решение этой проблемы (что может быть неоптимальным) заключается в том, чтобы запускать все чувствительные запросы в качестве общего пользователя «Приложения», выдавая себя за входного пользователя (требуя, чтобы я связал только зарегистрированного пользователя с именем пользователя ... что не плохо).

Моя проблема заключается в том, что я не уверен, как предоставить олицетворять всех пользователей определенной роли или всех пользователей в целом (не самая яркая идея, потому что я не хочу, чтобы приложение выдавало себя за системный администратор, например).

grant impersonate on all to ApplicationLogin 

не работает, и нет никакой документации, что я могу найти, что предполагает предоставление олицетворения на членов роли будет выполнимо ...

Любые идеи?

+0

Определяет ли определенная роль роль базы данных? –

+0

уверен, до тех пор, пока он может быть очень широк. – Crisfole

+1

Добавил некоторые подробности^ – Crisfole

ответ

0

Вы можете использовать Dynamic sql. приведенный ниже код извлекает всех пользователей, связанных с определенной ролью, а затем предоставляет разрешение выдавать себя за пользователя. Вы должны создать пользователя для входа в систему, чтобы связать его с базой данных, а затем предоставить разрешение на выдачу себя за всех членов определенной роли. Это код:

CREATE TRIGGER S2 
ON DATABASE 
FOR CREATE_USER 
AS 

CREATE TABLE #T 
(PRINCIPAL_NAME NVARCHAR(100),ROLE_NAME NVARCHAR(100)); 
WITH L AS (SELECT * 
      FROM (SELECT P.name AS 'PRINCIPAL_NAME',R.role_principal_id AS 'GH' 
       FROM SYS.database_principals P,sys.database_role_members R 
       WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id 
       AND type<>'R') S INNER JOIN (SELECT P.name AS 'ROLE_NAME',P.principal_id AS 'GHA' 
               FROM SYS.database_principals P,sys.database_role_members R 
               WHERE P.principal_id=R.member_principal_id OR P.principal_id=R.role_principal_id 
               AND type='R') D 
       ON D.GHA=S.GH) 
INSERT INTO #T 
SELECT DISTINCT PRINCIPAL_NAME,ROLE_NAME 
FROM L 
------------ ENTER ROLE NAME HERE 
WHERE ROLE_NAME LIKE '%%' 
------------ 
DECLARE @P NVARCHAR(100),@TEXT NVARCHAR(MAX)='' 
------------------------- CHANGE IT TO YOUR DESIRED NAME OF YOUR APPLICATION USER 
DECLARE @APPUSER NVARCHAR(100)='APPLICATION_USER' 
------------------------- 
DECLARE C CURSOR FOR SELECT PRINCIPAL_NAME FROM #T 
OPEN C 
FETCH NEXT FROM C INTO @P 
WHILE(@@FETCH_STATUS=0) 
    BEGIN 
     SET @TEXT+='GRANT IMPERSONATE ON USER::['[email protected]+'] TO '[email protected]+' ' 
     FETCH NEXT FROM C INTO @P 
    END 
CLOSE C 
DEALLOCATE C 
DROP TABLE #T 
EXEC(@TEXT) 

Я надеюсь, что это работает для вас.

+0

О, я имел в виду тот, который не требовал повторного запуска запроса каждый раз, когда пользователь был добавлен или удален или изменен ... – Crisfole

+0

нет механизма, который dbms мог бы узнать и сделать при добавлении пользователи. но если вы добавляете пользователей часто, вы можете добавить этот код к агенту sql server, чтобы делать это часто или почти ежечасно. этот запрос не является тяжелым для выполнения. –

+0

Я нашел его Вы должны создать триггер для создания, чтобы сделать это. Я обновлю свой пост. –

0

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

Чтобы настроить нынешних пользователей, вам придется циклически их перебирать и назначать олицетворение гранта за один раз.

Смежные вопросы