退出后,cake php的每一个奇怪行为


cakeVery strange behaviour from cake php after logging out

好了,情况是这样的:

  • Admin登录
  • Admin注销
  • 普通用户登录
  • 重定向到管理页面!

如果我在以普通用户身份登录之前删除存储的cookie,则登录工作正常。我注意到的另一个奇怪的事情是,当普通用户日志时,我的登录功能中的管理重定向实际上并没有运行,因此它们被重定向到其他地方。

下面是一些代码: 用户控制器:

<?php
    public function login() {
        if ($this->request->is('post') || $this->request->is('put')) {
            if ($this->Auth->login()) {
                //if login successful update logged in User as login does not use recursive find
                $this->User->id = $this->Auth->user('id');
                $this->User->read();
                $this->Auth->login($this->User->data);
                if($this->Login->isRole($this->Auth->user(), 'Admin')) {
                    //redirect admins to admin page, not ran when error occurs!!
                    $this->redirect(array('controller' => 'users', 'action' => 'index', 'admin' => true));  
                } else {
                    //isAuthorised in AppController takes care of redirect to registration page if required
                    $this->redirect($this->Auth->redirect());   
                }
            } else {
                //if login unsuccessful
                $this->Session->setFlash(
                    __('Invalid username or password, please try again.'), 
                    'alert',
                    array(
                        'plugin' => 'TwitterBootstrap',
                        'class' => 'alert-error'
                    )
                );
            }
        }
        //set layout
        $this->layout = 'not_logged_in';
        //set title
        $this->set('title_for_layout', 'Login');
    }
    public function logout() {
        //logout
        $this->redirect($this->Auth->logout());
    }
public function isAuthorized($user) {
    if(parent::isAuthorized($user)) {
        //call parent method for redirect and admin permission
        return true;
    }
    switch ($this->action) {
        case 'add':
        case 'resetPassword':
        case 'login':
            //logged in users cannot access registration, login or password reset pages
            return false;
            break;
        case 'add_role':
            //check user is finshing registration or has a role request accepted
            return (!$this->Login->isRegistrationComplete($user) || $this->Login->isRoleRequestAccepted($user));
            break;
        default:
            //all loogged in users can access the rest of User controller
            return true;
            break;
    }
}
php?>

应用程序控制器:

<?php
public $components = array(
    'Session',
    'Auth' => array(
        'className' => 'UserAuth',
        'loginRedirect' => array('controller' => 'users', 'action' => 'view'),
        'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
        'authorize' => array('Controller'),
        'authenticate' => array('Blowfish'),
        'authError' => 'Please login.',
        'loginError' => 'Invalid Username or Password entered, please try again.',
    ),
    'Login'
);
    public function isAuthorized($user) {
        //set values needed for all logged in pages
        $this->set('loggedIn', $user);
        $this->set('role', $user['User']['role']);  
        if($this->Login->isAccessing($this, 'users', 'logout')) {
            //never prevent user from logging out
            return true;
        }
        if($this->Login->isRole($user, 'Admin')) {
            //admin can access every action
            return true;
        } elseif ($this->request->prefix === 'admin') {
            //only admins allowed on admin pages
            throw new Exception('You do not have permission to access this page.', 1);
        }
        //get user role and requested role
        $roles = $this->Login->getRolesCurrentAndNew($user);
        if($this->Login->isRoleRequestAccepted($user)) {
            //user has an accepted role request
            $controller = 'users';
            $action = 'add_role';
            if($this->Login->isRedirectRequired($this, $controller, $action)) {
                //if user is already accessing registration this check prevents redirect loops
                if ($this->Login->isRegistrationComplete($user)) {
                    //display flash based on registration status
                    $this->Session->setFlash(
                        __('Your request for the role of '. strtolower($roles['new']) . ' has been accepted, please enter additional details.'), 
                        'alert',
                        array(
                            'plugin' => 'TwitterBootstrap',
                            'class' => 'alert-success'
                        )
                    );
                } else {
                    $this->Session->setFlash(
                        __('Please complete your registration.'), 
                        'alert',
                        array(
                            'plugin' => 'TwitterBootstrap',
                            'class' => 'alert-success'
                        )
                    );
                }
                $this->redirect(array('controller' => $controller, 'action' => $action));
            }
        } elseif (!$this->Login->isRegistrationComplete($user)) {
            //user has not registered yet and role request is not accepted
            if(!$this->Login->isRegistrationComplete($user)) {
                //user has not completed registration yet, awaiting approval
                throw new Exception('Your registration request is awaiting approval from a member of the admin team.', 1);
            }
        }
        return false;
    }
?>

航线配置:

    Router::connect('/login', array('controller' => 'users', 'action' => 'login'));
    Router::connect('/logout', array('controller' => 'users', 'action' => 'logout'));
    Router::connect('/register', array('controller' => 'users', 'action' => 'add'));
    Router::connect('/register/role', array('controller' => 'users', 'action' => 'add_role'));
    Router::connect('/', array('controller' => 'users', 'action' => 'view'));
    Router::connect('/admin', array('controller' => 'users', 'action' => 'index', 'admin' => true));
    Router::connect('/users/manageRoleRequest', array('controller' => 'roleRequests', 'action' => 'add'));

我最终意识到CakePHP会自动将您带到您在同一台机器上登出和登录时查看的最后一个页面,无论您是否以不同的用户登录

From the docs:

房地产AuthComponent:: $ logoutRedirect
的默认操作用户注销后重定向到。而AuthComponent不处理注销后重定向,将返回一个重定向URL从AuthComponent:注销()。默认为AuthComponent::$loginAction.

的意义:

$this->Auth->logout()

将返回字符串url。仅此而已。你用一个重定向来包装它,重定向到这个url:

public function logout() {
    $this->redirect($this->Auth->logout());
}

所以,不,蛋糕只会重定向到您通过"loginRedirect"设置指定的特定操作。在您的例子中是登录视图

我尝试了以下方法,它似乎对我有效

    public function logout() {
        $logout_redirect = $this->Auth->logout();
        $this->Auth->redirectUrl($this->Auth->redirect());
        return $this->redirect($logout_redirect);
    }