2011-02-09 184 views
2

我想擺脫Auth組件錯誤消息,特別是當我嘗試訪問不允許的操作時會出現的身份驗證錯誤消息避免CakePHP的身份驗證組件顯示身份驗證錯誤消息

只是可以肯定,我仔細檢查有沒有$this->Session->flash()呼叫佈局的任何地方。此外,設置空值不起作用,因爲組件具有默認消息值。

我使用的驗證部件與AppController的類中的下列配置:

class AppController extends Controller { 
    var $components = array(
     'Auth' => array(
      'userModel' => 'WebUser', 
      'loginAction' => '/login', 
      'loginRedirect' => '/', 
      'logoutRedirect' => '/login', 
      'autoRedirect' => false, 
     ), 
     'Session', 
     ... 
    ... 
} 

對於登錄註銷重定向我有安裝兩條路線:

Router::connect('/', array('controller' => 'posts', 'action' => 'index')); 
Router::connect('/login', array('controller' => 'web_users', 'action' => 'login')); 

登錄動作內WEBUSER控制器幾乎是空的;我只更改默認的佈局:

function login() { 
    $this->layout = 'login'; 
    $this->set('title_for_layout', 'Sign in'); 
} 

最後,我有一個非常簡單的login.ctp佈局文件:

<html> 
    <head> 
     ... 
    </head> 
    <body> 
     ... 
     <?php echo $content_for_layout; ?> 
     ... 
    </body> 
</html> 

當我訪問http://example.com/login是沒有問題的,沒有任何消息,只是登錄表單。不過,我請求任何其他操作時,系統驗證組件重定向到登錄行動剛過得到默認authError消息。出現了兩個問題:

  1. 爲什麼驗證組件顯示的提示信息時,有沒有 $this->Session->flash()通話地方? (見更新2下文)
  2. 我怎樣才能設置在authError屬性的空/空值?

謝謝!

UPDATE

我想出了一個非常醜陋的解決方案:我創建了一個元素login_error.ctp並分配給驗證組件初始化的flashElement屬性:

class AppController extends Controller { 
    var $components = array(
     'Auth' => array(
      'flashElement' => 'login_error', 
     ... 
    ... 
} 

在login_error.ctp我只是與驗證錯誤默認消息:

<?php if ($message !== 'You are not authorized to access that location.'): ?> 
<div id="flashMessage" class="message"><?php echo $message; ?></div> 
<?php endif; ?> 

它的作品,但我討厭它!

更新2

感謝dogmatic69回答我強迫自己再次檢查一切。我終於找到了致電$this->Session->flash()的地方。這是我以前寫過的一個小視圖元素。它與登錄/註銷無關,所以我沒有注意到該文件。

UPDATE 3

由於SpawnCxy answer爲好。複製Auth組件並進行自定義修改比字符串比較更好。

+0

什麼是顯示的確切消息? – OldWest 2011-02-09 21:16:30

+0

在Auth組件中設置的默認值:'您無權訪問該位置。'。當然,我試圖避免覆蓋組件:) – elitalon 2011-02-09 21:21:38

回答

1

還有另一種方式,使驗證組件的詳細personalized.You可以複製

/cake/libs/controller/components/auth.php

/app/controllers/components/auth.php

和編輯新copy.You的__setDefaults功能可以指定通過更改中的值來更改您自己的身份驗證錯誤消息。如果您不想顯示任何內容,請將其設置爲空字符串。

+0

好的一個!比讓錯誤傾向字符串比較更好 – elitalon 2011-02-10 10:01:17

8

在CakePHP 2.1在我AppController中,我使用這個覆蓋我的 「身份驗證」 的提示信息。 這裏是我的$組件:

public $components = array(
     'Acl', 
     'Auth' => array(
      'flash' => array(
      'element' => 'info', 
      'key' => 'auth', 
      'params' => array() 
     ), 
      'authorize' => array(
       'Actions' => array('actionPath' => 'controllers') 
     ), 
    ), 
     'Session', 
); 

我不確定如果你可以在蛋糕的早期版本中做到這一點。 此外,你可以這樣做:

function beforeFilter() { 
    //Configure AuthComponent. 
    $this->Auth->authorize = 'actions'; 
    $this->Auth->actionPath = 'controllers/'; 
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login', 'plugin' => NULL); 
    $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'login', 'plugin' => NULL); 
    $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login', 'plugin' => NULL); 
    $this->Auth->authError = __('You must be logged in to view this page.'); 
    $this->Auth->loginError = __('Invalid Username or Password entered, please try again.'); 
    $this->Auth->flash = array(
    'element' => 'info', 
    'key' => 'auth', 
    'params' => array() 
); 
} 

這也行!太好了!

1

我剛剛在Cake 2.x中測試了它,它工作。把它放在你的Controller的beforeFilter()函數中:

$this->Session->delete('Message.auth'); 
0

我有類似的情況。

當用戶登錄時,'/'路由到控制器中的儀表板操作。但是,當用戶未登錄時,我希望用戶能夠請求mydomain.com或mydomain.com/users/login 而不是收到authError消息。

但是,如果用戶請求任何其他頁面,我希望顯示「未授權」authError消息,因爲它通常會顯示。

這裏是我的解決辦法:在beforeFilter在AppController中

if($this->request->here == '/' && !$this->Auth->loggedIn()){ 
    $this->Auth->allow('dashboard'); //temporarily allow the dashboard action 
    $this->redirect(array('controller' => 'users', 'action' => 'login')); //manually redirect to login screen 
} 

的路線由於工作方式,如果用戶請求「/」,他們會收到AUTH錯誤。但是,如果他們請求/ controller_name/dashboard,他們收到驗證錯誤,因爲$ this-> Auth-> allow('dashboard')只會在請求'/'時觸發。

0

我練習另一個更好的方式比Young's Answer。在AppController的請將下面的代碼:

function beforeFilter(){ 
    ... ... ... 
    //set auth message custom id, if required. 
    $this->Auth->flash['key'] = 'YOUR-ID-HERE'; 
    //set auth message custom attributes e.g. class etc., if required 
    $this->Auth->flash['params']=array('class'=>'YOUR-CLASS-HERE'); 
    //set auth message custom element path, if required 
    $this->Auth->flash['element'] = 'YOUR-ELEMENT-PATH-HERE'; 
    ... ... ... 
} 

我希望它會比定製核心庫更好地爲一個簡單的工作。

0

我和一個類似的問題,但我使用CakePHP 3.4。我解決了編輯問題config/routes.php

//$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); 
$routes->redirect('/', ['controller' => 'Users', 'action' => 'login']);