  | 
				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    Заголовок сообщения: Спасибо! | 
				     | 
			 
			
				
  | 
			 
			
				| Спасибо! | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |