Вопрос

Проверить наличие прав у пользователя

Каким образом можно проверить, имеет ли пользователь какую-то организационную или функциональную роль, включая всевозможные варианты вхождения ролей?

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

У меня такой же вопрос

6 комментариев
Лучший ответ

Примерно так будет выглядеть sql запрос

with tempRecursive(Id, Name, ParentRoleId, level) as (
    select Id, Name, ParentRoleId, 0 as level
    from SysAdminUnit
    where id = '5905BE45-DFF1-4756-AF7C-92C6182F4602'
    Union All
    Select SysAdminUnit.Id, SysAdminUnit.Name, SysAdminUnit.ParentRoleId, (level+1) as level
    from tempRecursive join SysAdminUnit on tempRecursive.ParentRoleId = SysAdminUnit.Id
)

select * from tempRecursive
order by level

Варианта два:
1. Просканировать в системе все его роли. Вариантов не так много, Вы их все перечислили - фукциональная роль, орг. роль, руководитель + он может входить в роль системных администраторов явно или через подчиненного.
2. Проверить в БД таблицы SysAdminUnitInRole и SysUserInRole.

В 5.Х была C#-функция UserConnection.DBSecurityEngine.GetUserAdminUnitCollection. Возможно, и в 7.Х есть такая же. В качестве параметра — Id пользователя или без параметров для текущего.

Антон Малий пишет:

Таким образом он показывает только 1-е и прямое вхождение пользователя в роль. И никакие унаследованные роли так не видны.

Очевидно, нужно писать рекурсивный Select с разными проверками. Но я подозреваю, что уже такой функционал существует

Владимир Соколов,

К сожалению, готового скрипта нет. Можно воспользоваться функцией, предложенной Александром.

Примерно так будет выглядеть sql запрос

with tempRecursive(Id, Name, ParentRoleId, level) as (
    select Id, Name, ParentRoleId, 0 as level
    from SysAdminUnit
    where id = '5905BE45-DFF1-4756-AF7C-92C6182F4602'
    Union All
    Select SysAdminUnit.Id, SysAdminUnit.Name, SysAdminUnit.ParentRoleId, (level+1) as level
    from tempRecursive join SysAdminUnit on tempRecursive.ParentRoleId = SysAdminUnit.Id
)

select * from tempRecursive
order by level

Действительно, в итоге оказалось, что все права можно найти в SysAdminUnitInRole

Войдите или зарегистрируйтесь, чтобы комментировать