|
www.integro.ru ЦСИ ИНТЕГРО
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Вт 20 Мар 2012 21:04 Заголовок сообщения: Проблема с программным определением роли (группы) пользователя |
|
|
Здравствуйте!
Необходимо в модуле расширения определить, в какие группы входит пользователь, и соответственно - разрешать или запрещать те или иные действия. Интересно, что в версии 4.2 у меня все это работало, а при переходе на версию 4.4. незаметно перестало. Незаметно - в смысле, что обнаружилось это не сразу.
Список идентификаторов всех имеющихся в наличии ролей (то есть - групп) определяется хорошо. Всего их у нас 13. Проблемы начинаются, когда я пытаюсь определить список ролей (групп) в которые входит данный пользователь. Этот список ролей, как следует из Талмуда, должен возвращать метод IIngeoUser.RoleIDs, возвращаемое значение имеет тип OLEVariant. Каких-то properties, позволяющих узнать длину этого списка, я нигде не обнаружил, поэтому попылтался вычислить его по размеру возвращенного значения: sizeof(значение) div sizeof(TM2ID) но тут выяснилось, что sizeof всегда возвращает 16, что, во-первых, не кратно размеру типа TM2ID, а глевное - не зависит от числа групп, в которые входит пользователь! Само возвращаемое значение похоже на какой-то ID, но он не соответствует ни одному ID групп!
Что я делаю не так? |
|
Вернуться к началу |
|
|
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Ср 21 Мар 2012 14:20 Заголовок сообщения: |
|
|
RoleIDs это массив строк
вот примеры похожего кода в вбскрипте и на делфи
Код: |
const ingeoAdminGUID = "0"
const ingeoAdminUserID="000000000003"
const ingeoAdminRoleID="000000000004"
function CurrentUserIsAdmin()
dim roles, i, aDB, fl, aID
set aDB = Application.ActiveDB
aID = aDB.LogonUserID
if (aID=ingeoAdminGUID)or(aID=ingeoAdminUserID) then
CurrentUserIsAdmin = true
else
roles = aDB.Users.UserFromID(aID).RoleIDS
CurrentUserIsAdmin = true
for i=0 to uBound(roles)
if roles(i)=ingeoAdminRoleID then exit function
next
CurrentUserIsAdmin = false
end if
end function
|
Код: |
function RoleOrUserIsAdmin(const InDB :IIngeoDb; const aID:string; isRole:boolean):boolean;
var roles :OleVariant;
i :integer;
begin
if (aID=ingeoAdminGUID)or(aID=ingeoAdminUserID)or(aID=ingeoAdminRoleID)
then Result := true
else
if not isRole then begin //проверим роли пользователя
roles := InDB.Users.UserFromID(aID).RoleIDs;
Result := true;
for i:=VarArrayLowBound(roles, 1) to VarArrayHighBound(roles, 1) do
if SameText(roles[i], ingeoAdminRoleID) then exit;
Result := false;
end
else Result := false;
end;
|
_________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Последний раз редактировалось: APopov (Ср 21 Мар 2012 21:02), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Ср 21 Мар 2012 19:08 Заголовок сообщения: Спасибо! |
|
|
Спасибо! |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|