RBAC и другие проблемы

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

RBAC и другие проблемы

Сообщение ivanbuh »

Задача:
Есть таблица в базе данных пользователей с полем ролей administrator, moderator, user, guest.
В каком файле прописывать class WebUser из раздела рецепты RBAC и описание ролей?

Я делаю action login на первой странице своего проекта (файл login.php в views):

Код: Выделить всё

<?=CHtml::form(); ?>
<?=CHtml::errorSummary($form); ?><br>

    <table id="form2" border="0" width="400" cellpadding="10" cellspacing="10">
        <tr>
            <td width="150"><?=CHtml::activeLabel($form, 'username'); ?></td>
            <td><?=CHtml::activeTextField($form, 'username') ?></td>
        </tr>
        <tr>
            <td><?=CHtml::activeLabel($form, 'password'); ?></td>
            <td><?=CHtml::activePasswordField($form, 'password') ?></td>
        <tr>
        <tr>
            <td></td>
            <td><?=CHtml::submitButton('Enter', array('id' => "submit")); ?></td>
        </tr>
    </table>

<?=CHtml::endForm(); ?>
Код контроллера следующий:

Код: Выделить всё

<?php
    class BaseController extends CController {
    
    public $defaultAction='login';
    function init(){
        // Для гостей у нас и так роль по умолчанию guest.
        if(!Yii::app()->user->isGuest){
            // Связываем роль, заданную в БД с идентификатором пользователя,
            // возвращаемым UserIdentity.getId().
            Yii::app()->authManager->assign(Yii::app()->user->role, Yii::app()->user->id);
        }
    }
    public function actionLogin()
    {
        $form = new WebUser();
        if (!Yii::app()->user->isGuest) {
            throw new CException('Vi zaregestrirovanni!');
        } else {
            if (!empty($_POST['WebUser'])) {
                $form->attributes = $_POST['WebUser'];
                    if($form->validate('login')) {
                        $this->redirect(array('show'));
                    }
            }
            $this->render('login', array('form' => $form));
        }
    }
    public function actionShow()
    {
        if(Yii::app()->user->checkAccess('administrator')){
            echo "hello, I'm administrator";
        }
    }
} 
Файл WebUser.php:

Код: Выделить всё

<?php
class WebUser extends CWebUser {
    private $_model = null;
 
    function getRole() {
        if($user = $this->getModel()){
            // в таблице User есть поле role
            return $user->role;
        }
    }
 
    private function getModel(){
        if($this->_model === null){
            $this->_model = User::model()->findByPk($this->id);
        }
        return $this->_model;
    }
    public function rules()
    {
        return array(
            array('username, password', 'required'),
            array('password', 'authenticate', 'on' => 'login'),
        );
    }
    public function authenticate($attribute,$params)
    {
        if(!$this->hasErrors())
        {
            $identity= new UserIdentity($this->username, $this->password);
            $identity->authenticate();
                switch($identity->errorCode)
                {
                    case UserIdentity::ERROR_NONE: {
                        Yii::app()->user->login($identity, 0);
                        break;
                    }
                    case UserIdentity::ERROR_USERNAME_INVALID: {
                        $this->addError('username','!');
                        break;
                    }
                    case UserIdentity::ERROR_PASSWORD_INVALID: {
                        $this->addError('password','!!');
                        break;
                    }
                }
        }
    }
}
 
При входе на http://localhost/base/login ошибка WebUser does not have a method named "getErrors". Что я сделал нетак?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC

Сообщение samdark »

В каком файле прописывать class WebUser из раздела рецепты RBAC и описание ролей?
WebUser.php

— Зачем у WebUser rules()?
— Откуда у WebUser authenticate()?
— BaseController как контроллер использовать не надо. От него надо наследоваться.
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

Если authenticate в WebUser.php не нужен,то где использовать authenticate из UserIdentity.php? И в какой папке должен лежать WebUser.php?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC

Сообщение samdark »

где использовать authenticate из UserIdentity.php?
В своём контроллере, который обрабатывает форму логина.
В какой папке должен лежать WebUser.php?
Рядом с UserIdentity.php.
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

Где использовать следующий метод authenticate ???:

Код: Выделить всё

public function authenticate($attribute,$params)
    {
        if(!$this->hasErrors())
        {
            $identity= new UserIdentity($this->username, $this->password);
            $identity->authenticate();
                switch($identity->errorCode)
                {
                    case UserIdentity::ERROR_NONE: {
                        Yii::app()->user->login($identity, 0);
                        break;
                    }
                    case UserIdentity::ERROR_USERNAME_INVALID: {
                        $this->addError('username','!');
                        break;
                    }
                    case UserIdentity::ERROR_PASSWORD_INVALID: {
                        $this->addError('password','2!');
                        break;
                    }
                }
        }
    }
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC

Сообщение samdark »

Использовать в своём контроллере, который обрабатывает форму логина. Описывать в UserIdentity.
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

Правильно ли у меня описан actionLogin? Нужен ли файл модели User.php???:

Код: Выделить всё

<?php
class User extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'user';
    }

    public function rules()
    {
        return array(
            array('username, password', 'length', 'max'=>128, 'min' => 3),
            array('username, password', 'required'),
            array('password', 'authenticate', 'on' => 'login'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'login'      => 'Login',
            'password'  => 'Password',
        );
    }

    public function authenticate($attribute,$params)
    {
        if(!$this->hasErrors())
        {
            $identity= new UserIdentity($this->username, $this->password);
            $identity->authenticate();
                switch($identity->errorCode)
                {
                    case UserIdentity::ERROR_NONE: {
                        Yii::app()->user->login($identity, 0);
                        break;
                    }
                    case UserIdentity::ERROR_USERNAME_INVALID: {
                        $this->addError('username','!');
                        break;
                    }
                    case UserIdentity::ERROR_PASSWORD_INVALID: {
                        $this->addError('password','2!');
                        break;
                    }
                }
        }
    }
}
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC

Сообщение samdark »

В коде нет actionLogin. Ошиблись кодом?
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

который в самом первом сообщении
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

и как наследовать контроллеры?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC

Сообщение samdark »

Не совсем:
— Базовый контроллер по-хорошему надо расширять, а не использовать напрямую.
— $form у вас класса WebUser, что очень и очень странно. WebUser — это не модель.
— Кто передаёт $_POST['WebUser']? Ваша форма этого не делает.

Советую почитать:
http://yiiframework.ru/doc/guide/ru/topics.auth
http://yiiframework.ru/doc/blog/ru/prototype.auth
http://yiiframework.ru/doc/guide/ru/form.overview
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC

Сообщение samdark »

Контроллеры наследуются точно так же, как и любой другой класс в PHP.
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

Наследование производится так :class AdminController extends BaseController ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: RBAC

Сообщение samdark »

Ну да.
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

Но в браузере ошибка при входе localhost/admin/login:
PHP Error
Description

include(BaseController.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory
Source File
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: RBAC

Сообщение Dreammaker »

А где лежит BaseController,php ? прописан ли путь в импорте?
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

А как и в каком файле прописать путь к BaseController?
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

А как и в каком файле прописать путь к BaseController?

Итак, как я понимаю для того, чтобы приложение осуществляло вход с проверкой на страницу пользователем с определенной ролью (например, administrator), требуется следующее:
все файлы, описанные в статье RBAC и описание ролей в файле. А также модель User, т.е. файл User.php:

Код: Выделить всё

<?php
class User extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'user';
    }

    public function rules()
    {
        return array(
            array('username, password', 'length', 'max'=>128, 'min' => 3),
            array('username, password', 'required'),
            array('password', 'authenticate', 'on' => 'login'),
        );
    }

    public function authenticate($attribute,$params)
    {
        if(!$this->hasErrors())
        {
            $identity= new UserIdentity($this->username, $this->password);
            $identity->authenticate();
                switch($identity->errorCode)
                {
                    case UserIdentity::ERROR_NONE: {
                        Yii::app()->user->login($identity, 0);
                        break;
                    }
                    case UserIdentity::ERROR_USERNAME_INVALID: {
                        $this->addError('username','!');
                        break;
                    }
                    case UserIdentity::ERROR_PASSWORD_INVALID: {
                        $this->addError('password','2!');
                        break;
                    }
                }
        }
    }
} 
Dreammaker
Сообщения: 139
Зарегистрирован: 2009.09.02, 16:21
Откуда: Черкассы, Украина

Re: RBAC

Сообщение Dreammaker »

Если у вас в папке admin лежит отдельное приложение, то должно быть что-то типа такого в main.php этого приложения. Или похожий вариант был описан в рецептах на буржуйском сайте.

Код: Выделить всё

<?php

$frontend =  realpath('../protected');

Yii::setPathOfAlias('frontend', $frontend);

// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');

// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'ProjectName',

    // preloading 'log' component
    'preload'=>array('log'),

    // autoloading model and component classes
    'import'=>array(
        'application.models.*',
        'application.components.*',
        'frontend.models.*',
        'frontend.components.*',
    ), 
ivanbuh
Сообщения: 27
Зарегистрирован: 2009.08.25, 21:26

Re: RBAC

Сообщение ivanbuh »

При запуске в браузере http://base/admin ошибка:

CException
Description

Property "WebUser.0" is not defined.
Source File

C:\server\htdocs\Yii\www\framework\web\auth\CWebUser.php(112)
00100: /**
00101: * PHP magic method.
00102: * This method is overriden so that persistent states can be set like properties.
00103: * @param string property name
00104: * @param mixed property value
00105: * @since 1.0.3
00106: */
00107: public function __set($name,$value)
00108: {
00109: if($this->hasState($name))
00110: $this->setState($name,$value);
00111: else
00112: parent::__set($name,$value);
00113: }
00114:
00115: /**
00116: * PHP magic method.
00117: * This method is overriden so that persistent states can also be checked for null value.
00118: * @param string property name
00119: * @since 1.0.3
00120: */
00121: public function __isset($name)
00122: {
00123: if($this->hasState($name))
00124: return $this->getState($name)!==null;

Не подскажете почему?
Ответить