开发者

Auth allow not working always redirects to login

开发者 https://www.devze.com 2023-02-09 15:11 出处:网络
I have this in orders_controller.php function beforeFilter() { $this->Auth->allow(\'checkout\', \'checkout_confirm\', \'checkout_done\');

I have this in orders_controller.php

function beforeFilter() {
    $this->Auth->allow('checkout', 'checkout_confirm', 'checkout_done');
    parent::beforeFilter();
}

When I try to go to orders/checkout it always redirects me to users/login Don't know where to look for solution.

I have an app_controller.php in app/

class AppController extends Controller {
    var $components = array(
            'Email',
            'RequestHandler',
            'Session',
            'Cookie',
            'Auth' => array(
                'fields' => array(
                    'username' => "email",
                    'password' => "password"
                ),
                'autoRedirect' => true,
                'loginAction' => array('controller' => "users", 'action' => "login", 'admin' => false), //                'loginRedirect' => array('controller'
=> "users", 'action' => "check_account") //                'loginRedirect' => array('admin' => false, 'controller' => "users", 'action' => "account_home")
            ),
            'Acl',
            'Loviu'
    );

    var $helpers = array('Html', 'Form', 'Paginator', 'Session', 'Image', 'Javascript', 'Time', 'Text', 'Embed', 'Loviu');
    var $uses = array('User', 'Shelf');


function beforeFilter() {

    if (isset($this->params['admin']) && (1 == $this->params['admin'])) {

        $this->testAccess("admin");

    }

if($this->params['controller'] == 'pages'){
        $this->Session->write('menu.active', 'inactive');
    }

    $this->Auth->allow('display');

    if (false == $this->Session->check('Auth.User')) {

        if (empty($this->data)) {
            $cookie = $this->Cookie->read('Auth.User');
            if (false == is_null($cookie)) {
                // login user
                if ($this->Auth->login($cookie)) {
                    // delete auth message
                    $this->Session->delete('Message.auth');
                }
                else {
                    // delete invalid cookie
                    $this->Cookie->delete('Auth.User');
                }
     开发者_JAVA百科       } elseif(!$this->Session->read('loggedOut') && $this->params['action'] != 'login_fb') {
                 $this->__checkFBStatus();
            }
        }
    }

    $this->set('user_id', $this->User->id);

    $this->set('lng', $this->Cookie->read("language") ? $this->Cookie->read("language") : 'eng');
    parent::beforeFilter();
}


I would also put the $this->Auth->allow('checkout', 'checkout_confirm', 'checkout_done');line in your app_controller. In my experience, sometimes the problem is that the system gets confused about which controller this action belongs to, depending on how your code is setup.

Here is what I use in my app_controller that has been perfect, in case it helps:

function beforeFilter() {
    $this->allowAccess();
}

private function allowAccess() {
// this actually searches the URL to see what controller you're accessing, and allows actions for that controller.
    if(in_array($this->name, array('Pages'))) {
        $this->Auth->allow(array('home','blog','index'));
    }
}

This specificity has saved me so much trouble, and calling the Auth->Allow in app_controller is where it really should be. Hope this helps!


I had the same problem and solved for my project.

My cakephp version 3. While you loadcomponent just put loginaction.

class AppController extends BaseController
{
    public function initialize()
    {
        $this->loadComponent('Flash');
        $this->loadComponent('Auth', [
            'loginAction' => [
                'controller' => 'Admin',
                'action' => 'login',
                'plugin' => 'Admin'
            ],
            'loginRedirect' => [
                'controller' => 'admin',
                'action' => 'dashboard'
            ],
            'logoutRedirect' => [
                'controller' => 'admin',
                'action' => 'login'
            ]
        ]);
    }

}

hope helps others.


@rncrtr's answer worked for me, but I had to add the parent::beforeFilter() to the allowAccess method:

public function beforeFilter() {
  parent::beforeFilter();
  $this->allowAccess();
}

private function allowAccess() {
   if (in_array($this->name, array('Pages'))) {
     $this->Auth->allow(array('home','index','display'));
   }
 }

Oh yeah, I also had to add display to the allow array.


if you work on cakephp 2.x you must do like this :

function beforeFilter(){       
    $this->Auth->allow(array('action you want to allow1','action you want to allow2'));
}

allow(array()) instead allow()

---put that code into controller have action you want allow access without login

if you use $this->Auth->allow() you must call parent::beforeFilter(); in function beforeFilter() like this :

function beforeFilter(){     
             parent::beforeFilter();    
    $this->Auth->allow('add','view');
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号