如何在T-SQL中实现基于角色的安全性?

时间:2012-02-06 19:06:12

标签: security ssrs-2008

我正在为SSRS 2008报告开发存储过程,但我想根据运行报告的用户的角色来限制数据输出。我该怎么做呢?我想要做的是检索Windows用户名并根据此过滤记录,但用户使用“sa”帐户登录服务器。所以现在我想我应该使用AD登录。

我还看到了如何在SSRS而不是T-SQL sproc中设置安全性,以便用户可以访问相应的文件夹。但是这第二种方法听起来更麻烦,因为我们有很多不同的报告,因为我希望用户能够访问所有报告,但只能访问数据的不同部分。

通过报表服务器上的SSRS组和文件夹或T-SQL sproc内部实现安全性是否更好?

我查看了“(= User.UserID)”解决方案的链接,但是在实现此问题时遇到了问题。我做了什么:我通过选择文本查询在SSRS中创建了一个数据集:

select people_id from people_rv where last_name like 'd%'

这将返回people_id的列表

然后,我创建了一个新参数,并将其设置为等于上述数据集的可用值。我将其设为Text数据类型并允许Null和Blank值。没有默认值。最后,我为tablix设置了可见性:

=iif(Parameters!staff_id.Value in (select people_id from users),1,0)

但这会产生错误。我怎样才能重新制定这个tablix表达式?

1 个答案:

答案 0 :(得分:1)

无论用于访问数据源的方法如何,您仍然可以检索正在访问报告的用户ID(=User.UserID)。将其设置为SSRS中的内部参数,然后您可以非常轻松地将安全性合并到您的查询中。

查看你的this question几分钟后提交的答案。


使用BIDS和SSRS 2008R2(2008应该相同)的更具体的实施细节

  1. 创建一个参数,我们称之为“UserID”。类型应为Text,参数可见性应为“Internal”
  2. 此参数的默认值应设置为“指定值”,并添加值:=User.UserID
  3. 作为临时调试辅助工具,将参数拖动到设计图面以创建具有UserID值的文本框。 (如果您想要确认,请预览报告,并确保将其设置为您的用户ID。)
  4. 为下一个参数创建数据集:创建一个仅列出该用户可用值的数据集。查询可能类似于:

    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
    
  5. 设置您将向用户显示的参数。它应该从上一步的查询中获取available values

  6. 设置主数据集。它应该使用步骤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 )
    

    (此双重检查用户是否有权查看此类别。)