Session 故障排除Cakephp验证组件不允许执行允许的操作

Session 故障排除Cakephp验证组件不允许执行允许的操作,session,cakephp,authentication,Session,Cakephp,Authentication,9月2日更新: 这已成为一个很难解决的难题。建立一个基本的身份验证,这就是我想要的,应该只需要很少的步骤。我做了很多测试,添加和删除代码,查看cake手册,阅读教程,并逐步阅读Mariano Iglesias的cakePHP 1.3应用程序开发食谱-好书 但我仍然面临的问题是,应用程序控制器是“允许”操作工作的唯一场所。在单个控制器中,无法识别parent:beforeFilter,并且我被重定向回用户登录页面 非常感谢您的帮助。我想知道的是如何调试这类问题。是否有任何其他配置设置我应该看,如“

9月2日更新:

这已成为一个很难解决的难题。建立一个基本的身份验证,这就是我想要的,应该只需要很少的步骤。我做了很多测试,添加和删除代码,查看cake手册,阅读教程,并逐步阅读Mariano Iglesias的cakePHP 1.3应用程序开发食谱-好书

但我仍然面临的问题是,应用程序控制器是“允许”操作工作的唯一场所。在单个控制器中,无法识别parent:beforeFilter,并且我被重定向回用户登录页面

非常感谢您的帮助。我想知道的是如何调试这类问题。是否有任何其他配置设置我应该看,如“前缀路由”

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

9月1日更新:

经过大量测试后,问题似乎是无法识别单个控制器中的“before:filter”。post控制器中的示例:

    public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow = array('edit'); 
}
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');     
}
class PostsController extends AppController {

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

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow = array('edit'); 
}
以前有人发生过这种事吗?我参考了cakePHP手册以及许多在线文章和教程,但对我来说没有任何意义。我甚至尝试只使用用户和后控制器构建一个简单的应用程序,但仍然无法识别每个控制器中的before:filter设置

======================= 原来的问题

我使用Cakephp auth组件来管理一个管理部分。这是使用版本1.3.11

我遇到的问题是,即使每个控制器中都有允许的操作,我也会被重定向到用户登录页面

以下是应用程序控制器中的内容:

    public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow = array('edit'); 
}
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');     
}
class PostsController extends AppController {

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

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow = array('edit'); 
}
这是用户控制器中的内容: 类UsersController扩展了AppController{

var $name = 'Users';

function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow = array('add');  
}
这是posts控制器中的内容:

    public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow = array('edit'); 
}
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');     
}
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');但当我这样做时,允许的操作不再起作用

这有意义吗?允许的操作不应该独立于当前会话吗


谢谢Paul,当你注销时,我仍然可以访问管理部分:注销()应该有
$this->redirect($this->Auth->logout());
它应该清除身份验证会话数据

以下是我对appcontroller中beforeFilter()的建议:

    public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow = array('edit'); 
}
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');     
}
class PostsController extends AppController {

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

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

对于页面控制器:
$this->Auth->allow('display','view');

确保您没有在任何元素或视图中使用requestAction,确保requestAction调用的操作也被允许……这应该可以解决问题。

小心,已授权()AppController中返回true并不会使Auth无效。它只是意味着任何经过身份验证的用户都可以访问受AuthComponent保护的操作。由于他已将Auth::$authorize属性设置为“controller”,我相信他实际上需要让isAuthorized()方法在那里返回true。isAuthorized()方法是您可以放置代码以确认经过身份验证的用户是否有权访问特定方法的地方。您可以使用它设置多个前缀(admin、manager)并确定特定用户可以访问哪个。对。我正在考虑允许(“*”)。抱歉。不过,我认为他暂时不需要。因为它总是返回true。谢谢Anh,我理解这一部分。仍然是一个谜,为什么我总是被重定向到用户/登录,即使像“pages”这样的控制器有父::beforeFilter();用于允许的操作。忽略这些授权操作是没有任何意义的。我已经尝试了我能想到的一切,阅读蛋糕手册,在线搜索,观看youtube教程…仍然没有什么突出。有一点是一致的,在我登录后,一切都可以访问。任何关于解决问题的建议都非常感谢。谢谢s、 Paul Paul,我的问题与您的问题完全相同…我已将parent::beforeFilter();$this->Auth->allow('gestao_acessibilidade')添加到页面控制器,并且它一直重定向到登录…当我尝试访问gestao_acessibilidade时…我真的不知道该做什么!:(嗯,您可以添加有关注销操作的任何详细信息吗?请尝试设置登录和注销重定向,然后重试$this->Auth->loginAction=array('controller'=>'users','action'=>'login');$this->Auth->logoutRect=array('controller'=>'users','action'=>'logout');$this->Auth->loginDirect=array('controller'=>'posts','action'=>'add');嗨,8vius,我尝试了这个,但问题没有什么不同。在我的测试中,我发现如果在app_控制器中我允许所有这样的操作,$this->Auth->allow('*'));然后所有操作都被授权,但是如果我只授权'index',然后在单个控制器中授权其他类似的方法,则公共函数beforeFilter(){parent::beforeFilter();$this->Auth->allow=array('view','aboutUs');},它们无法识别,我被重定向到用户登录页面。所以问题仍然是控制器中的parent:beforeFilter不起作用。想法?谢谢Rui,虽然这本身并不能解决问题,但我所做的是删除所有“auth”引用,然后将它们加载回需要auth的控制器中。这似乎是错误的允许可以从auth中排除的auth和controller操作正常工作。仍然非常奇怪,这不是cake应用程序所期望的。再次感谢您的输入和帮助。