CakePHP Auth Deny Admin Routing Pages - PullRequest
       7

CakePHP Auth Deny Admin Routing Pages

3 голосов
/ 28 августа 2011

Весь день я читал вопросы о переполнении стека, пытаясь это выяснить ..

У меня есть пользовательский контроллер с функциями index / login / logout / register, но также есть admin_index / admin_add / admin_edit / admin_delete и т. Д.

У меня включен компонент Auth, и в моем users_controller я пытаюсь запретить доступ к страницам admin_ *, если Auth.User.role != 'admin', когда я включаю $this->Auth->authorize = 'controller';, он запрещает доступ к странице site.com/admin/users/ а также, кажется, убивает функцию выхода из системы, даже если в моей учетной записи установлена ​​роль администратора.

Однако, если я введу URL, я перенаправлюсь обратно на главную домашнюю страницу.

users_controller.php

<?php
class UsersController extends AppController {

    var $name = 'Users';

    function beforeFilter(){
        parent::beforeFilter();
        $this->Auth->authorize = 'controller';
        $this->Auth->allow('register');
    }

    function isAuthorized() {
        if ($this->Auth->user('role') != 'admin') {
            $this->Auth->deny('admin_index','admin_view', 'admin_add', 'admin_edit','admin_delete');
        }
    }

app_controller.php

<?php
class AppController extends Controller {

    var $components = array('Auth', 'Session');

    function beforeFilter() {
        $this->Auth->loginAction = array('controller'=>'users','action'=>'login', 'admin'=>false);
        $this->Auth->logoutRedirect = array('controller'=>'users','action'=>'logout');
        $this->Auth->loginRedirect = array('controller'=>'shows', 'action'=>'index');
        $this->Auth->autoRedirect = false;
        $this->Auth->allow('home');
    }

Мой второй вопрос касается способа $this->Auth->deny('page'); перенаправления пользователя, насколько я могу сказать, он перенаправляет на /, но мне нужно, чтобы он перенаправлял обратно на контроллер пользователя.

Надеюсь, все это имеет смысл, и я предоставил достаточно информации ..

Ответы [ 2 ]

8 голосов
/ 29 августа 2011

Корень вашей проблемы, вероятно, в вашем методе isAuthorized (). Это должно просто возвращать true или false и указывать, авторизован ли аутентифицированный пользователь для доступа к определенному действию.

Трудно сказать, почему вы будете перенаправлены на домашнюю страницу вместо страницы входа. Но возможно, что у вас есть другой код где-то, что все портит.

Попробуйте изменить код, как показано ниже, и посмотрите, не поможет ли это сделать:

app_controller.php

<?php 
class AppController extends Controller {
    var $components = array('Session', 'Auth' => array(
        'loginAction' => array('controller'=>'users','action'=>'login', 'admin'=>false),
        'logoutRedirect' => array('controller'=>'users','action'=>'logout'),
        'loginRedirect' => array('controller'=>'shows', 'action'=>'index'),
        'autoRedirect' => false,
        'authorize' => 'controller'
    );

function beforeFilter() {
    $this->Auth->allow('home');
}

function isAuthorized() {
    if (!empty($this->params['prefix']) && $this->params['prefix'] == 'admin') {
        if ($this->Auth->user('role') != 'admin') {
            return false;
        }
    }
    return true;
}
?>

users_controller.php

<?php
class UsersController extends AppController {

var $name = 'Users';

function beforeFilter(){
    parent::beforeFilter();
    $this->Auth->allow('register');
}
?>

Я перенес все настройки Auth в объявление в переменной $ components, потому что оно кажется более чистым и имеет больше смысла объявлять значения по умолчанию там. Но это скорее вопрос личных предпочтений, и он не должен оказывать реального влияния на функционирование кода.

Также обратите внимание, что если вы установите для autoRedirect значение false, вам придется перенаправлять зарегистрированных пользователей вручную в действии Users :: login (), получая значение loginRedirect с помощью $this->Auth->redirect().

Я не вижу никакой причины, по которой вас следует отправлять в / когда вы не вошли в систему и пытаетесь получить доступ к заблокированному действию, но, возможно, вам будет легче выяснить это после исправления вышеуказанного. **

0 голосов
/ 28 августа 2011

вы должны сделать это как ...

       function beforeFilter()
        {
        if($this->Auth->user('role')=='admin'){
         $this->Auth->allow('admin_view','admin_controls');//put your all admin actions separated by comma

         }
else
{
$this->Auth->allow('home');//put your all non-admin actions separated by comma
}


    }

надеюсь, что это сработает ... если возникнут проблемы, дайте мне знать ....

...