Каким образом можно проверить, имеет ли пользователь какую-то организационную или функциональную роль, включая всевозможные варианты вхождения ролей?
Например, необходимо узнать, есть ли у пользователя функциональная роль для утверждения документов, при этом он её может получить напрямую, через орг-структуру (со всей иерархией), как руководитель орг-структуры (через подчиненных) и еще какими-то стандартными способами.
Нравится
Примерно так будет выглядеть 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