sp_setapprole并创建用户/登录

时间:2014-01-23 14:42:56

标签: sql sql-server

我们已经设置了SQL Server和我们的应用程序,使得SQL Server登录在使用除我们的应用程序之外的任何工具访问数据库时都没有权限。这是必需的,因为有些人可能会启动访问(或SQL Server Management Studio),并且能够以这种方式操作数据。

因此,我们设置了一个Application Role,并为该Application Role提供了必要的权限。一切都运行良好,用户无法访问我们的表,除非他们使用我们的应用程序。

现在出现了问题。在我们的应用程序中,应该可以创建其他登录/用户,或将某些特定用户设置为管理员(只有管理员可以执行与用户相关的操作)。我不是100%肯定,但在这种情况下,我认为用户需要SecurityAdmin角色。所以我们的应用程序中有一些代码如下:

IF NOT EXISTS ( SELECT  name
                FROM    sys.server_principals
                WHERE   name = @LoginName )
    BEGIN
        SET @SQL = 'CREATE LOGIN [' + @LoginName + '] WITH PASSWORD = '''
            + @Password + ''', DEFAULT_DATABASE=[' + @DBNAME
            + '], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF';
        EXECUTE(@SQL);
    END

IF NOT EXISTS ( SELECT  name
                FROM    sys.database_principals
                WHERE   name = @LoginName )
    BEGIN
        SET @SQL = 'CREATE USER [' + @LoginName + '] FOR LOGIN ['
            + @LoginName + ']';
        EXECUTE(@SQL);
    END

IF EXISTS ( SELECT  name
            FROM    sys.server_principals
            WHERE   name = @LoginName )
    BEGIN
        EXEC sp_addsrvrolemember @LoginName, 'securityadmin'
    END

问题当然是server_principals位于主数据库中,我无法为我的应用程序角色授予这些权限。有没有办法解决这个问题或解决这个问题的简单方法?

2 个答案:

答案 0 :(得分:1)

在SQL Server中,当您激活应用程序角色(AppRole)时,其安全上下文完全取代了用户的安全上下文。虽然这可以在会话(连接)中恢复,但是两个安全上下文(AppRole和User)不能同时处于活动状态。

因此,将这两者结合使用的常用方法就是到目前为止你是如何做到的(*):也就是说,只使用用户/登录 来启用连接到数据库最初,然后切换到AppRole,以获得对数据库内容的访问。

但是,如果要在数据库中启用不同级别的权限/权限,则无法通过用户/登录(不仅仅是反正)来执行此操作。有几种不同的方法可以解决这个问题,但实现目标的最简单方法可能是为不同类别的应用程序用户提供不同的AppRoles。因此,您可以为大多数用户设置ApplUser角色,为管理员等用户设置ApplAdmin角色。然后,您可以根据需要在数据库中授予这些额外的AppRoles,增强的权限和访问权限。

(*和的赞誉。这是SQL Server的非常良好的安全方案,但很少有应用程序开发人员努力实现它。)< / p>

答案 1 :(得分:0)

您应该查看SQL Server中的EXECUTE AS子句:

EXECUTE AS Clause

然后,您可以将逻辑放入数据库中的存储过程,将其设置为以不同的用户(或者所有者,如果数据库的所有者具有执行操作的权限)执行。您需要做的就是为Application Role授予执行该过程的权限,仅此而且代码本身将作为其他用户执行。