0

好的,这是场景:

  • 管理员登录
  • 管理员登出
  • 普通用户登录
  • 重定向到管理页面!

如果我在以普通用户身份登录之前删除存储的 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'));
4

3 回答 3

0

我最终意识到,无论您是否以其他用户身份登录,当您在同一台机器上注销和登录时,CakePHP 都会自动将您带到您正在查看的最后一页。

于 2013-06-24T14:45:27.107 回答
0

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

    public function logout() {
        $logout_redirect = $this->Auth->logout();
        $this->Auth->redirectUrl($this->Auth->redirect());
        return $this->redirect($logout_redirect);
    }
于 2014-07-11T07:00:56.937 回答
0

从文档:

属性 AuthComponent::$logoutRedirect
用户注销后重定向到的默认操作。虽然 AuthComponent 不处理注销后重定向,但重定向 URL 将从 AuthComponent::logout() 返回。默认为 AuthComponent::$loginAction。

意义:

$this->Auth->logout()

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

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

所以,不,Cake 只会将您重定向到您通过“loginRedirect”设置指定的特定操作。在您的情况下,您的登录视图。

于 2013-06-24T15:20:14.237 回答