2011-08-29 46 views
0

9月2日更新:故障排除CakePHP的權威性組件不允許允許的操作

這已成爲一個非常困難的難題解決。建立一個基本的認證,這是我想要的,應該涉及很少的步驟。我做了很多測試,添加和刪除代碼,審查蛋糕手冊,閱讀教程,並逐步通過Mariano Iglesias的CakePHP 1.3應用程序開發菜譜 - 一本好書。 http://goo.gl/93BGw

但我仍然面臨的問題是應用程序控制器是'允許'操作工作的唯一地方。在單獨的控制器中,parent:beforeFilter沒有被識別,我被重定向回到用戶登錄頁面。

任何與此有關的幫助真的很感激。我想知道的是如何調試這種類型的問題。有沒有其他的配置設置我應該看看,比如'前綴路由'?

=======================

9月1日更新:

大量的測試似乎是這個問題後,在個別控制器中的「之前:過濾器」未被識別。後控制器中的示例:

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow = array('edit'); 
} 

有沒有人有過這種情況?我已經提到了CakePHP手冊以及許多在線文章和教程,它對我沒有任何意義。我甚至試圖用只有用戶和後控制器構建一個簡單的應用程序,但仍然沒有識別每個控制器中的before:filter設置。

======================= 原始問題。

我正在使用Cakephp身份驗證組件來管理管理部分。這是使用版本1.3.11

我遇到的問題是,即使在每個控制器允許的操作,我被重定向到用戶登錄頁面。

這裏是什麼在應用程序控制器:

class AppController extends Controller { 

var $components = array(
'Auth' => array(
'authorize' => 'controller' 
), 
'Session', 
'RequestHandler' 
); 

public function isAuthorized() { 
return true; 
} 

function beforeFilter(){ 
    $this->Auth->authorize = 'controller'; 
    $this->Auth->fields = array('username' => 'username', 'password' => 'password'); 
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 
    $this->Auth->authError = 'Please login to view that page '; 
    $this->Auth->loginError =' The user name or password you entered did not work, please try again ' ; 
      $this->Auth->allow('display'); 
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 
    $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'logout'); 
    $this->Auth->loginRedirect = array('controller' => 'pages', 'action' => 'display', 'home');  
} 

這是什麼在用戶控制器: 類UsersController擴展的AppController {

var $name = 'Users'; 

function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow = array('add'); 
} 

這是什麼在崗位控制器:

class PostsController extends AppController { 

var $name = 'Posts'; 
var $components = array('Session','RequestHandler', 'Email'); 

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow = array('edit'); 
} 

我發現的是,已經登錄我可以像預期的那樣訪問主頁。然後當我去註銷時,會話並沒有被完全銷燬,所以我可以回到'管理'部分。

我曾嘗試使用$ this-session('destroy');在註銷操作中,但是當我執行了允許的操作時不再工作。

這是否有意義?不允許的行爲是否獨立於當前會話?

謝謝,保羅

+0

嗯,你能添加關於你的註銷操作的任何細節嗎? – mtnorthrop

+0

嘗試設置登錄和註銷重定向並再試一次 $ this-> Auth-> loginAction = array('controller'=>'users','action'=>'login'); $ this-> Auth-> logoutRedirect = array('controller'=>'users','action'=>'logout'); $ this-> Auth-> loginRedirect = array('controller'=>'posts','action'=>'add'); – 8vius

+0

嗨8vius,我試過這個,並沒有問題的區別。在我的測試中,我發現如果在app_controller中允許所有這樣的操作,$ this-> Auth-> allow('*');那麼所有的動作都被授權,但是如果我只授權'索引'然後在單獨的控制器中授權其他類似這樣的方法,\t public function beforeFilter(){0} {0}}}}} \t \t $ this-> Auth-> allow = array('view','aboutUs'); \t \t},它們不被識別,我被重定向到用戶登錄頁面。所以問題仍然是控制器中的parent:beforeFilter不起作用。想法? – Paul

回答

1

確保您沒有任何的元素使用requestAction或視圖,請確保由requestAction調用的操作也被允許......這應該解決它。

+0

感謝睿,雖然這本身並沒有解決問題,但我也做了刪除所有'auth'引用,然後將它們加載回需要auth的控制器。這似乎允許認證和控制器操作可能會被排除在身份驗證之外,仍然非常奇怪,而不是從蛋糕應用程序期望的。再次感謝您的意見並幫助每個人。 – Paul

1

對於一個用戶註銷時,我仍然可以訪問管理員區:註銷()應具有$this->redirect($this->Auth->logout());應該清除驗證會話數據。

下面是我在AppController中建議的beforeFilter():

function beforeFilter(){ 
    $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'dashboard'); 
} 

,並在頁面控制器:$this->Auth->allow('display', 'view');

+1

小心,讓AppController中的isAuthorized()返回true不會使Auth失效。這僅表示任何已通過身份驗證的用戶都可以訪問受AuthComponent保護的操作。而且,由於他將Auth :: $ authorize屬性設置爲'controller',我相信他實際上需要讓isAuthorized()方法在那裏返回true。 isAuthorized()方法是您可以放置​​代碼的位置,這些代碼用於確認經過身份驗證的用戶是否有權訪問特定的方法。您可以使用它來設置多個前綴(管理員,管理員)並確定哪個特定用戶可以訪問。 – mtnorthrop

+0

+1 mtnorthrop是正確的 – dubvfan87

+0

沒錯。我在考慮允許('*')。抱歉。儘管如此,我認爲他現在不需要這個。因爲它總是返回true。 –