2

我现在因为一个问题而发疯了好几天。我使用了 youtube 上的文档和视频。还有一些仅关于该特定问题的教程。但是有一些我看不到的错误。我使用 cakephp 在 Web 系统中创建了一个登录系统。我的用户表如下:

    CREATE TABLE `usuarios` (
    `Id` INT(50) UNSIGNED NOT NULL AUTO_INCREMENT,
    `grupo_id` INT(50) UNSIGNED NOT NULL,
    `Status` VARCHAR(30) NOT NULL COMMENT 'Coordenador/Bolsista/Super',
    `Nome` VARCHAR(50) NOT NULL,
    `Login` VARCHAR(50) NOT NULL,
    `Email` VARCHAR(50) NOT NULL,
    `Senha` VARCHAR(50) NOT NULL,
    `created` DATETIME NULL DEFAULT NULL,
    `modified` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`Id`),
    UNIQUE INDEX `Login` (`Login`),
    UNIQUE INDEX `Nome` (`Nome`),
    INDEX `FK_usuarios_grupos` (`grupo_id`),
    CONSTRAINT `FK_usuarios_grupos` FOREIGN KEY (`grupo_id`) REFERENCES `grupos` (`Id`) ON UPDATE CASCADE
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=8;

其中 Status 是系统不同部分的授权级别。评论中描述了这 3 个选项。

In my AppController, after some time, I coded:

    class AppController extends Controller {
    public $components = array('Session',
                               'Auth'=>array(
                                          'authenticate' => array(
                            'Form' => array(
                                           'fields'=>array(
                                                           'username'=>'Login',
                                                           'password'=>'Senha'
                                                            ),
                                    'userModel'=> 'Usuario'
                            ),
                           ),
                           'loginAction' =>array(
                                                    'Controller' => 'Usuarios',
                                                    'action' => 'login'
                                           ),
                'loginRedirect'=>array('Controller'=>'Usuarios', 'action'=>'index'), 
                'logoutRedirect'=>array('Controller'=>'Usuarios', 'action'=>'index'), 
                'authError'=>"You can't access that page", 
                'authorize'=>'Controller', 
                'loginError'=> 'Login errado'

            )
    );

    public function isAuthorized($usuario=null) {
        //return parent::isAuthorized($usuario);
        return true;
    }

    public function beforeFilter() {
        $this->Auth->allow('index','view');
        $this->set('logged_in', $this->Auth->loggedIn());
        $this->set('current_user', $this->Auth->user());
    }
    }?>

isAuthorized 方法有两个选项,因为我正在尝试……主要问题是,每次我尝试登录时,我都会看到 AuthError 消息。无论是已注册的(带有散列密码)还是无效的。我不明白为什么会发生这种情况,但我怀疑这是 isAutorized 方法的问题。

我的特定控制器具有以下相关方法:

public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                return $this->redirect($this->Auth->redirect());   
            } else {
                $this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth');
                $this->Session->setFlash('Username or password is incorrect');

            }
        }
    }

    public function logout() {
        $this->redirect($this->Auth->logout());
    }   
    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('add_bolsista','logout');
    }

    public function isAuthorized($usuario = null) {
        if (($usuario['Status'] == 'Super') || ($usuario['Status'] == 'Coordenador') || ($usuario['Status'] == 'Bolsista')) {
            return true;
        }
        if (in_array($this->action, array('edit', 'delete'))) {
            if ($usuario['Id'] != $this->request->params['pass'][0]) {
                return false;
            }
        }
        return true;
    }

    public function isAuthorized($usuario = null) {
    // Any registered user can access public functions
    if (empty($this->request->params['Bolsista'])) {
        return true;
    }

    // Only admins can access admin functions
    if (isset($this->request->params['Super'])) {
        return (bool)($usuario['Status'] === 'Super');
    }

    // Default deny
    return false;
}

两个版本的 isAuthorized...似乎都没有真正起作用。任何人??

4

1 回答 1

0

如果您只想使用 auth 组件登录系统,则无需定义 isAuthorized 方法。不使用此方法尝试一次。

您不需要在您的特定控制器中的 allow() 方法中提供注销方法,而是应该在其中定义“登录”,因为该方法将可以公开访问。希望它对你有用。

于 2012-07-07T08:02:00.950 回答