SQL Server 2012中的权限级联/继承

问题描述 投票:0回答:2

我有一个三层系统:一个Web客户端,一个Servlet(TOMCAT)和一个带有数据和逻辑的SQL Server。

客户端向Servlet发送请求,Servlet将其转发到单个存储过程(让我们称之为DISPATCHER)。 DISPATCHER检查请求的性质,并调用另一个存储过程,旨在处理收到的特定请求。

Serlet的连接使用一组特定的凭证(让我们将其称为Web_Client)并且已授予DISPATCHER的EXECUTE权限,而没有为任何其他元素(过程,表,视图等)定义访问权限。 。

令我惊讶的是,尽管Web_Client有权执行DISPATCHER,但在调用某些内部过程时会收到错误消息(而其他人则不会生成任何错误)。

这种奇怪行为的原因是什么?

sql-server stored-procedures permissions
2个回答
0
投票

您所谈论的是所有权链接。

你可以在这里阅读更多信息:Ownership Chains

简而言之,如果有完整的ownership chain,则不检查权限,即你的外部proc和你的内部procs具有相同的owner,并且其中的所有对象具有相同的owner

如果是Ownership chain或不同的数据库,dynamic sql在不同的所有者的情况下被打破。

所以你现在需要的是注意阅读错误信息并检查没有权限的对象的所有者,它就在那里链被破坏了。

关于DENY。如果所有权链是不间断的,Deny不会引发此错误,这是因为在这种情况下不检查权限,因此DENY也不会检查。


0
投票

对我来说,这似乎是一个ownership chain问题。

当多个数据库对象按顺序相互访问时,该序列称为链。虽然这些链不是独立存在的,但当SQL Server遍历链中的链接时,SQL Server对组成对象的权限评估方式与单独访问对象时的权限不同。这些差异对管理安全性具有重要意义。

所有权链的基本概念是,当您被授予访问数据库对象(在您的情况下是存储过程)的权限时,如果存储过程由拥有的同一登录所拥有,则不会检查存储过程使用的任何其他数据库对象的权限。原始存储过程。 如果原始存储过程使用某些不属于存储过程所有者的数据库对象,则必须具有使用此对象的权限。

请注意,执行链中第一个对象的用户不需要是该对象的所有者,只需具有对它的执行权限即可。

所以在这种情况下,似乎抛出执行权限被拒绝错误的内部过程只是属于另一个登录。

© www.soinside.com 2019 - 2024. All rights reserved.