8

有什么区别...

execute as user = 'testuser'

execute as login = 'testuser'

我在这些登录名下执行一个跨数据库过程,它与作为登录名的执行一起工作,而不是作为用户执行。这是说服务器主体“testuser”不能在安全上下文下访问数据库“xxx”。

当我SELECT SYSTEM_USER在两个命令之后我看到它设置为'testuser'

4

3 回答 3

13

execute as login提供对整个服务器的模拟,因为登录是在服务器级别上的。由于用户是按数据库定义的,因此execute as user模拟仅适用于特定数据库,这就是您在跨数据库时看到错误的原因。

于 2012-04-06T15:40:53.423 回答
3

EXECUTE AS 可以添加到存储的过程、函数、触发器等。

执行方式示例:

CREATE PROCEDURE dbo.MyProcedure
      WITH EXECUTE AS OWNER

在这种情况下,您将冒充被调用模块的所有者

您还可以模拟SELF,或创建或更改模块的USER或...模拟CALLER,这将使模块能够获得当前用户的权限,或者...模拟OWNER,它将获得以下权限该过程的所有者被称为 OR... impersonate 'user_name',它将模拟特定用户 OR... impersonate 'login_name'with 将模拟特定登录。

可以通过以下方式设置对象(如存储过程)的权限

GRANT EXECUTE ON <schema>.<procedurename> to <username>; 

但是,您可能还想在登录和用户级别授予安全权限。

您将只想确定和授予需要访问(例如执行)的对象的必要权限考虑使用"EXECUTE AS"能够模拟另一个用户来验证执行代码所需的权限而不必授予所有底层对象(例如表)的所有必要权限的功能。

大多数时候,您只需要授予存储过程的执行权限,然后将权限授予存储过程中引用的所有对象。

这样,您不需要赋予隐式权限(例如:更新数据或调用其他 procs)。 所有权链为您处理这个问题。这对于动态 sql 或者如果您需要创建提升的安全任务(例如CREATE TABLE. EXECUTE AS考虑这些的方便工具)特别有用。

这个例子可能有助于澄清所有这些:

--Create a user called NoPrivUser with public access to a database (e.g. dbadb)

USE [master]
GO
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], CHECK_EXPIRATION=ON, CHECK_POLICY=ON
GO
USE [DBAdb]
GO
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser]
GO

注意:此过程的创建者或所有者将需要在目标数据库中创建表权限。

use DBAdb
go
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER
AS
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].MyTable') AND type in (N'U')) 
CREATE TABLE MyTable (PKid int, column1 char(10)) 
INSERT INTO MyTable
VALUES (1,'ABCDEF')

GO

GRANT EXEC ON dbo.MyProcedure TO NoPrivUser;
GO

-- 现在以 NoPrivUser 身份登录到您的数据库服务器并运行以下命令。

use dbadb
go

EXEC dbo.MyProcedure

--(1 row(s) affected)

现在尝试在以 NoPrivuser 身份登录时从新表中进行选择。

您将获得以下信息:

select * from MyTable
go

消息 229,级别 14,状态 5,第 1 行对象“MyTable”、数据库“DBAdb”、模式“dbo”的 SELECT 权限被拒绝。

这是意料之中的,因为您仅在以 NoPrivUser 身份登录时在 Owner 的安全上下文中运行了该过程。
NoPrivUser 因为没有实际读取表的权限,只是执行创建和插入行的过程。

使用 EXECUTE AS 子句,存储过程在对象所有者的上下文中运行。此代码成功创建 dbo.MyTable 并成功插入行。

在此示例中,用户“NoPrivUser”绝对没有授予修改表或读取或修改此表中的任何数据的权限。
它仅具有完成此过程上下文中编码的特定任务所需的权限。

This method of creating stored procedures that can perform tasks that require elevated security rights without permanently assigning those rights come be very useful.

于 2012-06-23T00:02:35.293 回答
2

登录范围在服务器级别,而用户范围在当前数据库级别

http://msdn.microsoft.com/en-us/library/ms181362.aspx

于 2012-04-06T15:41:38.587 回答