【问题标题】:How to Grant Permission to IMPERSONATE any other user?如何授予模仿任何其他用户的权限?
【发布时间】:2013-10-14 07:52:28
【问题描述】:

为了记录我正在开发的应用程序的使用情况,我需要每个使用我的应用程序的用户在他们自己的凭据下对我的 SQL Server 数据库执行查询。

为了以可检索的方式存储他们的密码,我不能在每个用户的基础上创建一个连接(因为这需要知道他们的密码超过了简短的窗口时他们登录)。

这个问题的解决方案看似显而易见(可能不是最佳的)是作为通用“应用程序”用户运行所有敏感查询,模拟登录用户(要求我只将登录用户与用户名...这不是一件坏事)。

我的问题是我不确定如何授予某个角色的所有用户或所有一般用户的模拟权限(这不是最聪明的想法,因为我不希望应用模拟系统管理员) .

grant impersonate on all to ApplicationLogin

不起作用,而且我找不到任何文件表明授予角色成员模拟是可行的...

有什么想法吗?

【问题讨论】:

  • 某个角色是指数据库角色吗?
  • 当然,只要它可以是一个非常广泛的。

标签: sql-server tsql database-permissions


【解决方案1】:

您可以使用动态 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::['+@P+'] TO '+@APPUSER+' '
        FETCH NEXT FROM C INTO @P
    END
CLOSE C
DEALLOCATE C
DROP TABLE #T
EXEC(@TEXT)

我希望它对你有用。

【讨论】:

  • 哦,我的意思是不需要在每次添加、删除或更改用户时重新运行查询...
  • 没有任何机制可以让 dbms 发现并执行添加用户的操作。但是如果您经常添加用户,您可以将此代码添加到 sql server 代理中,以便经常或几乎每小时执行一次。这个查询执行起来并不繁重。
  • 我找到了您应该在创建时创建一个触发器来执行此操作。我会更新我的帖子。
  • 现在它将适用于创建并映射到角色的每个用户。但是如果创建用户时没有映射到角色,然后用户映射到角色,则此触发器不会触发。这个和 sql server 代理的结合将达到你的目标。没有别的办法。
【解决方案2】:

您可以通过存储过程创建用户。存储过程的最后一行是授予模拟权限。

要设置当前用户,您必须循环访问所有用户并设置一次授权模拟。

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 2013-09-14
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    相关资源
    最近更新 更多