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

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



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

Нравится

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

Показать все комментарии