2011-08-29 71 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。 –