2011-08-28 57 views
3

我一直在閱讀堆棧溢出問題,整個下午都試圖弄清楚這一點..CakePHP的驗證拒絕管理路由頁面

我有一個指數/登錄/註銷/註冊功能的用戶控制器,但也有admin_index/admin_add/admin_edit/admin_delete等

我啓用了驗證組件,並在我的users_controller我試圖拒絕訪問ADMIN_ *頁面如果Auth.User.role != 'admin',當我使$this->Auth->authorize = 'controller';它拒絕訪問site.com/admin/users /頁面,也似乎殺死註銷功能,即使我的帳戶的角色設置爲管理。

但是,如果我輸入的網址,我重定向回到主頁。

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');將用戶重定向,據我可以告訴它重定向到/但我需要它重定向回用戶控制器。

希望這一切有意義,我已經提供了足夠的信息..

回答

8

問題的根源可能是您的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變量中的聲明中,因爲它是s eems更清晰,並更有意義地在那裏聲明默認值。但這更多的是個人偏好問題,它不應該對代碼的功能產生真正的影響。

另外,請注意,如果您將autoRedirect設置爲false,則必須在Users :: login()操作中手動重定向登錄用戶,並獲取loginRedirect$this->Auth->redirect()

我沒有看到任何理由爲什麼你應該被髮送到/當你沒有登錄,你試圖訪問一個被阻止的動作,但也許會更容易找出解決上述問題後。* *

+0

工程治療!謝謝!我做了一個用戶測試登錄,並嘗試去site.com/admin/users/它否認我,但仍然重定向到/而不是顯示/索引...任何想法?或者我應該開一個新的問題? – medoix

+0

您是以管理員用戶身份登錄的用戶,角色是「admin」嗎?如果您希望用戶在登錄時將其重定向到site.com/shows/,請從AuthComponent配置中刪除讀取'autoRedirect'=> false的行。另外,我只注意到你的logoutRedirect很奇怪。這應該是用戶在註銷後重定向到的位置。也許嘗試刪除AppController中的autoRedirect和logoutRedirect行,然後看看事情是如何工作的。 – mtnorthrop

+0

如果普通用戶試圖訪問'/ admin /'頁面,則無法正確重定向。任何想法如何解決這個問題? – waspinator

-1

你應該這樣做,就像...

 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 
} 


    } 

希望它會工作...如果任何問題,讓我知道。 ...

+0

我剛剛試過這個解決方案,現在我不能登錄頁面,如果沒有Auth'd和登錄時無法訪問任何admin_頁面。 – medoix

+0

如果用戶使用任何其他角色登錄,他也可以看到這些頁面。我發現的方式是通過使用重定向,如果用戶不具有管理角色。認證 - >允許或認證 - >拒絕都失敗 – Liko