Как красиво оформить проверку прав в Yii?

Разбираюсь с правилами, создал все это делал, все работает. Остается дизайнерский вопрос как красивенько формить это дело?

К примеру есть правило для новостей (операция news, которая позволяет удалить, редактировать и добавить) и каждое правило по отдельности.

Yii::app()->user->checkAccess('news') // Добавить, редактировать, удалить
   Yii::app()->user->checkAccess('news:add') // Добавить
   Yii::app()->user->checkAccess('news:edit') //  редактировать
   Yii::app()->user->checkAccess('news:delete') // удалить


Подскажите пожалуйста как правильное (красивее) будет оформить это дело:

Вижу только такой вариант:
$ryle_news = Yii::app()->user->checkAccess('news');
$ryle_news.add = Yii::app()->user->checkAccess('news:add');

if(!$ryle_news || $ryle_news.add)
{
      // У Вас нет прав для добавления новости 
}
  • Вопрос задан
  • 7409 просмотров
Решения вопроса 2
AMar4enko
@AMar4enko
По-моему вы слабо понимаете, что делаете.
Если у вас для каждого действия отдельное правило в AuthManager, то зачем вам общее правило?
Вам достаточно проверить Yii::app()->user->checkAccess('news:add'), зачем вам проверять Yii::app()->user->checkAccess('news') и зачем оно вообще нужно?
Хотите дать сразу все привилегии - давайте доступ автоматом ко все операциям.
Ответ написан
@hector
php программист
Тут скорее всего надо сделать так (в моем случае роли реализованы через консольную команду):
1) работаем с CPhpAuthManager и добавляем операции
$auth = Yii::app()->authManager;
   /* @var $auth CPhpAuthManager */
   $auth->clearAll();
$auth->createOperation('news_view', 'просмотр');
   $auth->createOperation('news_add', 'добавление');
   $auth->createOperation('news_edit', 'редактирование');
  $auth->createOperation('news_delete', 'удаление');

2) работаем с задачами
$task = $auth->createTask('news_admin_task', 'Для администратора сайта разрешаем выполнять все действия сайта');
        $task->addChild('news_edit');
        $task->addChild('news_delete');

 $bisRule = 'return Yii::app()->user->id==$params["news"]->user_id;';
 $task = $auth->createTask('news_owner_task', 'Тут применяем бизнес-логику и разрешаем работать с отдельной новостью автору данной новости', $bisRule);
        $task->addChild('news_edit');
        $task->addChild('news_delete');

3) Работаем с пользователями сайта
$bizRule = 'return Yii::app()->user->isGuest;';
        $role = $auth->createRole(Users::GUEST, 'гость может только смотреть новости', $bizRule);
        $role->addChild('news_view');

        $role = $auth->createRole(Users::AUTOR, 'автор наследуют все что может гость(просмотр новости) + задачу news_owner_task');
        $role->addChild(Users::GUEST);
        $role->addChild('news_owner_task');
        $task->addChild('news_add');

$role = $auth->createRole(Users::ADMIN, 'админ может все!');
        $role->addChild(Users::GUEST);
        $role->addChild('news_admin_task');
        $task->addChild('news_add');


4) Все сохраняем в файл data/auth.php
$auth->save();

5) Теперь работаем в нужном контролере на примере контролера редактирования
class NewsController extends Controller
{
public function actionEditNews($id)
{
 $model = News::model()->findByPk($id); //грузим модель нужную
  if(!Yii::app()->user->checkAccess('news_edit', array('news'=>$model))) //проверяем только операцию, в данном случае не вызовет исключение для пользователей админа и автора именно этого поста, для остальных выдаст 403 ошибку
        {
            throw new CHttpException(403);
        }
}
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mihailkog
Я бы посоветовал использовать для реализации RBAC (контроль доступа на основе ролей) в Yii, например, вот это решение.
Ответ написан
Комментировать
des1roer
@des1roer
ученье - свет, а неученье - приятный полумрак
очень сильно пршу опубликовать статью в блоге\на форуме как это правильно делается
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы