如何在T-SQL中实现基于角色的安全性?
我正在为SSRS 2008报告开发存储过程,但我想根据运行报告的用户的角色来限制数据输出。我该怎么做呢?我想要做的是检索Windows用户名并基于此过滤记录,但用户使用“sa”帐户登录到服务器。所以现在我想我应该使用AD登录。如何在T-SQL中实现基于角色的安全性?
我也看到了如何在SSRS中设置安全性,而不是T-SQL sproc,以便用户可以访问相应的文件夹。但是,第二种方法听起来更麻烦,因为我们有许多不同的报告,并且我希望用户可以访问所有报告,但只能访问数据的不同部分。
通过报告服务器上的SSRS组和文件夹实现安全性,还是通过T-SQL sproc实现安全性更好?
我查看了“(= User.UserID)”解决方案的链接,但是在实现时遇到了问题。我做了什么:我创建了SSRS的数据集选择的文本查询:
select people_id from people_rv where last_name like 'd%'
这返回的people_id的
一个名单,然后,我创建了一个新的参数,将其设置为可用上述数据集值。我使它成为文本数据类型并允许空值和空值。没有默认值。最后,我设置可见的表矩阵:
=iif(Parameters!staff_id.Value in (select people_id from users),1,0)
但是,这会产生错误。我怎样才能重新表达这个tablix表达?
不管用于访问数据源的方法如何,仍可以检索访问报告的用户标识(=User.UserID
)。将其设置为SSRS中的内部参数,然后您可以非常轻松地将安全性融入您的查询中。
查看this question提交的答案后几分钟你的。
实现使用出价和SSRS 2008R2的更多具体细节(2008年应该是相同的)
- 创建一个参数,让我们称之为 “用户名”。类型应为文本和参数的知名度应该是“内部”
- 此参数的默认值应设置为指定的值,并添加值:
=User.UserID
- 作为一个临时的辅助调试,参数拖动到您的设计表面创建一个带有UserID值的文本框。 (如果您想确认,请预览报告并确认已设置为用户ID。)
-
为您的下一个参数创建数据集:创建一个仅列出此用户的可用值的数据集。查询可能是这样的:
SELECT CategoryName, CategoryID FROM Categories c INNER JOIN CategoryPermissions cp ON c.ID = cp.CategoryID INNER JOIN Users u ON cp.UserID = u.People_ID WHERE u.WindowsAccount = @UserID
设置一个参数,您将显示给用户。它应该从上一步中的查询中获得
available values
。-
设置您的主数据集。它应该同时使用步骤5中的参数值和步骤4中的权限查询。类似:
SELECT * FROM Products p INNER JOIN Categories c ON p.CategoryID = c.ID INNER JOIN CategoryPermissions cp ON c.ID = cp.CategoryID INNER JOIN Users u ON cp.UserID = u.People_ID WHERE u.WindowsAccount = @UserID AND c.CategoryName in (@Categories)
(这种双重检查用户具有看到该类别的权限。)
嗨杰米,你能看看我上面修改过的描述吗? – salvationishere 2012-02-06 20:56:31
非常感谢杰米。我正在测试你的解决方案。 – salvationishere 2012-02-06 22:06:36
我很兴奋!这是解决方案!杰米,非常感谢! – salvationishere 2012-02-06 22:17:18
作为参考:在NO条件应SA密码是分布式的或由应用程序使用。这是由于一个原因:由数据库管理员访问。即使这样,我会劝说不要以任何理由使用它。 SA是一个众所周知的用户名,是基于字典攻击的常见目标。在应用程序中进一步使用它表示相关应用程序对数据库服务器本身具有绝对的全面控制权:这是不好的。 – NotMe 2012-02-06 21:07:54