  | 
				Cake-PHP.ru Форум программистов CakePHP (на сайт)  
				 | 
			 
		 
		 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 06 Ноя 2007 14:24:51    Заголовок сообщения: ACL | 
				     | 
			 
			
				
  | 
			 
			
				здрасте!
 
Народ, кто-нибудь использовал ACL в своих разработках? Я в первые рассматриваю ACL такого вида для организации прав доступов. До этого всегда использовал свои разработки.
 
 
Не могу разобраться вот в чем:
 
Например есть роли (пользователи, из таблицы users):
 
id | foreign_key | alias
 
1 | 1 | null
 
2 | 2 | null
 
3 | 3 | null 
 
(alias не юзаю, т.к. кроме юзеров, других ролей не предвидится, поэтому строго цепляю на foreign_key - id юзверя).
 
 
А вот как дальше быть!?
 
Есть у меня, грубо говоря, две таблицы - messages (сообщения), files (файлы). Мне необходимо распределить права на каждое сообщение и на каждый файл. Как мне хранить ресурсы, так?:
 
 
id | object_id | alias
 
1 | 1 | 'messages'
 
2 | 2 | 'messages'
 
3 | 1 | 'files'
 
4 | 2 | 'files' 
 
 
т.е. в alias я указываю таблицу, а object_id - id записи в этой таблице. Но в таком случае непонятно - как организовывать доступ? Или я вообще не верным путем иду?    | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		VolCh
  цитировать
 
 
  Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
  | 
		
			
				 Добавлено: 06 Ноя 2007 16:58:20    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Завтра сам с этим разбираться буду   | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		Vlad
  цитировать
 
 
  Зарегистрирован: 02 Ноя 2007 11:45:52 Сообщения: 241
 
  | 
		
			
				 Добавлено: 06 Ноя 2007 21:38:25    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				А я по-прежнему пользуюсь obAuth, с небольшими модификациями.
 
Создал себе 3 группы, наделал юзеров.
 
Добавил хелпер, который, в зависимости от группы, отображает или нет нужные элементы, ну а компонентом "прикрыл" функции контроллера.
 
Осталось только решить вопрос (до сих пор небыло необходимости   - юзер имеет право редактировать только свой профайл. И всё.
 
 
ACL - сложнова-то, и учитывая, традиционную нехватку времени, решил не ковырять   | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		KPOTOB Гость цитировать
 
 
 
 
 
 
  | 
		
			
				 Добавлено: 07 Ноя 2007 00:43:18    Заголовок сообщения:  | 
				      | 
			 
			
				
  | 
			 
			
				| VolCh - расскажи чего нароеш - а то все что по ACL есть к прикрытию данных не относиться | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		VolCh
  цитировать
 
 
  Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
  | 
		
			
				 Добавлено: 07 Ноя 2007 00:58:48    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Вот это http://www.ibm.com/developerworks/ru/edu/os-php-cake2/section5.html читал? | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 07 Ноя 2007 06:34:14    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | VolCh писал(а): | 	 		  | Вот это http://www.ibm.com/developerworks/ru/edu/os-php-cake2/section5.html читал? | 	  
 
 
Да, конечно читал. Но судя по описанию, все распределения прав и дальнейшая проверка осуществляется по алиасам. В таком случае я не вижу логики хранить id в object_id. Вот и решил, что либо дока не совсем точная, либо я совсем запутался. Вот и хочу услышать советов от людей которые уже использовали ACL.
 
 
Т.е. если следовать описанию, то мои ресурсы будут выглядеть так:
 
id | object_id | alias
 
1 | 1 | 'messages_1'
 
2 | 2 | 'messages_2'
 
3 | 1 | 'files_1'
 
4 | 2 | 'files_2' 
 
при этом проверяя право, object_id учавствовать вобще не будет:
 
 
 	  | Код: | 	 		  
 
// ... здесь процедуры получения информации о файле в $fileInfo
 
// теперь проверяем доступ пользователя к файлу
 
if ($this->Acl->check($this->Session->read('user'), 'files_' . $fileInfo['id'], 'read')) {
 
   // ...
 
} | 	  
 
 
Получается что поле object_id работает только тогда, когда ресурсы сложены в одну таблицу! Или всеже я заблуждаюсь? | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		VolCh
  цитировать
 
 
  Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
  | 
		
			
				 Добавлено: 08 Ноя 2007 00:34:34    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Я сейчас разбираюсь с ACL в 1.2, если у тебя 1.1 то, там вроде имя модели в таблице aco хранить нельзя и очевидных нет решений.. если только сделать еще одну таблицу куда пихать подряд id мессаг и файлов, а уж её id пихать в object_id
 
 
Для твоей проблемы решение для 1.2 вроде вот http://bakery.cakephp.org/articles/view/how-to-use-acl-in-1-2-x, довольно понятно.
 
 
А вот я что-то не могу разобраться, если ухожу от модели таблицы и доступ по действиям хочу давать.  Вот только действия эти на одну таблицу или один id в таблице не завязаны и что указывать в model и foreign_id совсем не понятно, да и в parent_id тоже.
 
 
Попробую сейчас в гуглегруппе спросить буржуйской   | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 08 Ноя 2007 07:23:15    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				У меня версия 1.1. Решение для себя нашел. В aco просто забил на object_id и полностью использую alias.
 
 
Организовал следующую структуру в aco (указаны имена alias):
 
 	  | Код: | 	 		  model.all
 
   model.message
 
      model.message.1
 
      model.message.2
 
      ...
 
   model.file
 
      model.file.1
 
      model.file.2
 
      ... | 	  
 
Таким образом если необходимо дать доступ на все модели, например суперадмину, то я даю ему полные права на model.all, если на отдельную модель, то даю model.<name>, если на запись - model.<name>.<id>.
 
При проверки id пользователя всегда знаю, модель тоже известна, и соответственно id запрашиваемого элемента.
 
Заодно определяю доступ пользователя к разделам сайта, т.е. если у пользователя нет доступа, например, к модели post, значит и контроллер posts для него закрыт.
 
Пока такая схема работает.
 
 
Версию 1.2. Даже еще не рассматривал. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 08 Ноя 2007 08:12:01    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				По доступу к контроллеру погорячился. Такая схема не совсем подходящая. Если у пользователя есть доступ только к одной записи модели, но нет доступа на всю модель, то в таком случае контроллер его отбреет и он не увидит доступной для него записи.
 
Здесь лучше организовать свою ветку aco:
 
 	  | Код: | 	 		  all
 
   model.all
 
      model.message
 
         model.message.1
 
         model.message.2
 
         ...
 
      model.file
 
         model.file.1
 
         model.file.2
 
         ...
 
   controller.all
 
      controller.messages
 
         controller.messages.index
 
         controller.messages.comments
 
         controller.messages.view | 	  
 
Тут мы выиграем на том, что можем раздавать права не только на контроллер, но и на действия.
 
Схему не проверял, как раз этим буду заниматься. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		VolCh
  цитировать
 
 
  Зарегистрирован: 21 Окт 2007 07:17:33 Сообщения: 47 Откуда: Санкт-Петербург
  | 
		
			
				 Добавлено: 08 Ноя 2007 14:26:29    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Во, то что мне нужно.. Вот только обязательно с алиасами работать для контролеров? | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 08 Ноя 2007 14:40:03    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | VolCh писал(а): | 	 		  | Вот только обязательно с алиасами работать для контролеров? | 	  
 
Исходя из имеющихся методов - да. Т.к. все методы Acl (назначение прав, проверка) в параметрах требуют алисы.
 
Здесь проблем не возникает, узнать контроллер всегда можно - $this->params['controller'] или $this->name.
 
 
И еще. Сегодня попробовал запустить Acl на версии 1.2, и не фига не заработало  . Создавать aco и aro методом create не хочет, даже не ругается, просто не создает. Добавлял ручками в БД и методом save (метод модели), после чего проверить права не мог, метод check дает ошибку - "неудачная проверка, aro - такой-то, aco - тако-то". | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 12 Ноя 2007 09:09:25    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| VolCh, больше не разбирался с ACL? На версии 1.2 работает? | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 13 Ноя 2007 12:40:59    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				короче, нарыл следующее... можно делать еще проще!
 
делаем Аросы, где корнем будет User, и вложения id пользователей (пишу только алисы):
 
 
делаем Акосы, где корнями будут имена моделей, а вложения это id элементов этих вложений (также только алисы):
 
 	  | Код: | 	 		  Message
 
   1
 
   2
 
   3
 
File
 
   1
 
   2
 
   3 | 	  
 
теперь можно раздавать права и проверять следующим образом:
 
 	  | Код: | 	 		  //даем доступ юзеру 1 на файл 2
 
$this->Acl->allow('User/1', 'File/2', '*');
 
 
//проверяем доступ изменения у юзера 3 на сообщение 3
 
$this->Acl->check('User/3', 'Message/3', 'update'); | 	  
 
Это работает в 1.2 для 1.1 не проверял. И так не не нашел где применяются поля 'model', 'foreign_key', в выше указанной схеме, все работает на алисах, все запросы генерируются через алисы, хотя было бы проще работать через эти поля. _________________ На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		ztalker
  цитировать
 
 
  Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
  | 
		
			
				 Добавлено: 13 Ноя 2007 14:01:06    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				в 1.1 эта схема не работает _________________ На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		cyberfox
  цитировать
 
 
  Зарегистрирован: 20 Янв 2008 14:50:10 Сообщения: 16
 
  | 
		
			
				 Добавлено: 26 Мар 2008 19:33:02    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Вот пример работы с ARO и  ACO  в ACL cakePHP 1.2 Может кому пригодится:
 
 
 	  | Код: | 	 		  
 
<?php
 
   class AclsController extends AppController{
 
      var $components = array('Acl');
 
      var $uses = array('Aro', 'Aco');
 
      
 
      function init(){
 
          $this->Aco->create();
 
          $this->Aco->save(array(
 
                   'model'=>'',
 
                   'foreign_key'=>null,
 
                   'parent_id'=>null,
 
                   'alias'=>'AdminModules'));            
 
                  
 
          $this->Aco->recursive=0;
 
          $parent = $this->Aco->findByAlias('AdminModules');
 
           $parentId = $parent['Aco']['id'];       
 
 
           
 
           $this->Aco->create();
 
          $this->Aco->save(array(
 
                'model'=>'Modules',
 
                'foreign_key'=>1,
 
                'parent_id'=>$parentId,
 
                'alias'=>'AdminModules::1'));
 
          
 
          $this->Aco->create();
 
          $this->Aco->save(array(
 
                'model'=>'Modules',
 
                'foreign_key'=>2,
 
                'parent_id'=>$parentId,
 
                'alias'=>'AdminModules::2'));
 
 
          $this->Aro->create();
 
          $this->Aro->save(array(
 
               'model'=>'',
 
               'foreign_key'=>null,
 
               'parent_id'=>null,
 
               'alias'=>'Guest'));
 
          
 
          $this->Aro->create();
 
          $this->Aro->save(array(
 
               'model'=>'Admins',
 
               'foreign_key'=>null,
 
               'parent_id'=>null,
 
               'alias'=>'Admin'));
 
          
 
          $parent = $this->Aro->findByAlias('Admin');
 
             $parentId = $parent['Aro']['id'];    
 
         
 
             $this->Aro->create();
 
             $this->Aro->save(array(
 
               'model'=>'Admins',
 
               'foreign_key'=>1,
 
               'parent_id'=>$parentId,
 
               'alias'=>'Admin::1'));
 
          
 
 
             
 
           $this->Acl->allow('Admin', 'AdminModules', '*');
 
           $this->Acl->allow('Guest', 'AdminModules', array());   
 
               
 
      }
 
   }
 
?> | 	 
  | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
	
	
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы можете начинать темы Вы можете отвечать на сообщения Вы можете редактировать свои сообщения Вы можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
  
Powered by phpBB © 2001, 2005 phpBB Group Русская поддержка phpBB
  
 
 
		 |