Как реализовать безопасность на основе ролей в T-SQL? - PullRequest
1 голос
/ 06 февраля 2012

Я занимаюсь разработкой сохраненного процесса для отчета SSRS 2008, но я хочу ограничить вывод данных в соответствии с ролью пользователя, запустившего отчет. Как мне это сделать? Я хотел получить имя пользователя Windows и отфильтровать записи, основанные на этом, но пользователи используют учетную запись «sa» для входа на сервер. Так что теперь я думаю, что вместо этого я должен использовать AD логин.

Я также видел, как можно настроить безопасность в SSRS вместо sproc T-SQL, чтобы пользователи имели доступ к соответствующим папкам. Но этот второй подход звучит гораздо более обременительно, поскольку у нас много разных отчетов, и потому что я хочу, чтобы пользователи имели доступ ко всем отчетам, но только к различным частям данных.

Лучше ли реализовывать безопасность с помощью групп и папок SSRS на сервере отчетов или внутри sproc T-SQL?

Я посмотрел эту ссылку для решения "(= User.UserID)", но у меня возникли проблемы с его реализацией. Что я сделал: я создал набор данных в SSRS, выбрав текстовый запрос:

select people_id from people_rv where last_name like 'd%'

Возвращает список people_id

Затем я создал новый параметр и установил его равным указанному выше набору данных для доступных значений. И я сделал это тип данных Text и разрешить значения Null и Blank. Нет значений по умолчанию. Наконец, я установил видимость для таблицы:

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

Но это приводит к ошибке. Как я могу переформулировать это выражение таблицы?

1 Ответ

1 голос
/ 07 февраля 2012

Независимо от метода, используемого для доступа к источнику данных, вы все равно можете получить идентификатор пользователя (=User.UserID), который обращается к отчету. Установите для этого параметра внутренний параметр в SSRS, и тогда вы сможете очень легко включить безопасность в свои запросы.

Проверьте ответ на этот вопрос , отправленный через несколько минут после вашего.


Более конкретные детали реализации с использованием BIDS и SSRS 2008R2 (2008 должен быть идентичен)

  1. Создайте параметр, назовем его «UserID». Тип должен быть Text, а видимость параметра должна быть «Internal»
  2. Значение по умолчанию для этого параметра должно быть установлено в Указать значения, и добавить значение: =User.UserID
  3. В качестве временного средства отладки перетащите параметр в область конструктора, чтобы создать текстовое поле со значением идентификатора пользователя. (Предварительно просмотрите отчет и убедитесь, что в нем указан ваш идентификатор пользователя, если вы хотите подтвердить.)
  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 )
    

    (Это двойная проверка, что пользователь имеет разрешение на просмотр этой категории.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...