Rbac + Логин + Пароль

всем привет

возникла необходимость управлять доступом к админке на основе файла, в котором хранятся логины и пароли

в связи с этим полез читать про RBAC, но увидел там только роли…

а где пароли? :)

и вообще после прочтения статьи остались смутные чувства, что я нифига не понял или не то ожидал увидеть

когда-то управлял одним из сайтов (не на Yii) посредством такого набора =


'section' => array(

	'rus' => 'Раздел',

	'persons' => array(

		'user1' => array(

			'password' => 'pass1',

			'fullname' => 'Firstname1 Lastname1',

			'access' => array('index','addnews','editnews',),

			'mail' => 'user1@mail.ru',

		), 

		'user2' => array(

			'password' => 'pass2',

			'fullname' => 'Firstname2 Lastname2',

			'access' => array('index','addnews','editnews',),

			'mail' => 'user2@mail.ru',

		),             

	),        

),

народ, подскажите — как лучше организовать встроенными средствами Yii управление доступом, где и логин и пароль хранятся в файле

Не совсем понял что вам нужно :)

RBAC - role based access control, зачем там пароли?)

Пароли и логины используются для аутентификации пользователей, а не для распределения доступа.

Аутентификация делается при помощи унаследования класса UserIdentity и переписывания функции authenticate(). Тут по сути не особо имеет значение где находятся логины и пароли. Пропишите чтобы они брались из файла и проверялись с введенными вместо того чтобы брать их из БД.

Далее после аутентификации у пользователя будет роль. По роли и проверяется есть ли доступ к определенным действиям и т.п.

Единственное что можно украсить - это написать модель для работы с файлом. Писал подобное для работы с конфигами, если интересно вот gist https://gist.github.com/ineersa/6410546

а я по-наивности думал, что там могут храниться и логины с паролями :(

а не сможете поподробнее на малюсеньком примере? файл с логинами и паролями будет правиться вручную

p.s. за ссылку спасибо!

Ну по сути все тоже самое как и в обычной аутентификации:




public function actionLogin()

	{

	if (Yii::app()->user->isGuest) {

	$model=new UserLogin;

	// collect user input data

	...

        // validate user input and redirect to previous page if valid

	...

        // display the login form

	...

	}




Модель




class UserLogin extends CFormModel

{

	public $email;

	public $password;

	public $rememberMe;


	/**

	 * Declares the validation rules.

	 * The rules state that username and password are required,

	 * and password needs to be authenticated.

	 */

	public function rules()

	{

		return array(

			array('email, password', 'required'),

			array('email', 'email'),

			array('password', 'authenticate'),//все начинается тут

		);

	}


	/**

	 * Authenticates the password.

	 * This is the 'authenticate' validator as declared in rules().

	 */

	public function authenticate($attribute,$params)

	{

	if(!$this->hasErrors())  // we only want to authenticate when no input errors

		{

		$identity=new UserIdentity($this->email,$this->password);

		$identity->authenticate();

		switch($identity->errorCode)

		{

		   case UserIdentity::ERROR_NONE:

		   $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days

		   Yii::app()->user->login($identity,$duration);

			break;

		   case UserIdentity::ERROR_EMAIL_INVALID:

		   $this->addError("email",UserModule::t("Email is incorrect."));

					break;

		   case UserIdentity::ERROR_USERNAME_INVALID:

		   $this->addError("email",UserModule::t("Email is incorrect."));

					break;

		   case UserIdentity::ERROR_STATUS_NOTACTIV:

		   $this->addError("status",UserModule::t("Your account is not active."));

					break;

		   case UserIdentity::ERROR_STATUS_BAN:

		   $this->addError("status",UserModule::t("You account is blocked."));

					break;

		   case UserIdentity::ERROR_PASSWORD_INVALID:

		   $this->addError("password",UserModule::t("Password is incorrect."));

					break;

			}

		}

	}

}



Ну и собственно сам UserIdentity который кладите в компоненты:




class UserIdentity extends CUserIdentity

{

	private $_id;

	const ERROR_EMAIL_INVALID=3;

	const ERROR_STATUS_NOTACTIV=4;

	const ERROR_STATUS_BAN=5;

	

	public function authenticate()

	{

	if (strpos($this->username,"@")) {

	$user=MyModel::model()->getuser(array('email'=>$this->username));

	} else {

	$user=MyModel::model()->getuser(array('username'=>$this->username));

        //тут реализуйте например getUser в модели, которая будет возвращать данные пользователя из файла

	}

	//далее делайте проверки аутентификации, например так

	if(Yii::app()->getModule('user')->encrypting($this->password)!==$user->password) $this->errorCode=self::ERROR_PASSWORD_INVALID;

	...

        return !$this->errorCode;

	}


}






По поводу как брать из файла - тут каждому свое. Можно парсить, например explode, ну или хранить в виде сериализованого массива. Можно в csv, например в 1 строке ключи (email,password), а дальше строки с ними, тут можно использовать fgetcsv() - которая вернет массив со значениями из строки.

ок спасибо пошел разбираться

я правильно понимаю, что использование какого-либо специального файла UserIdentity обозначается в модели?

типа = $this->_identity=new UserIdentitySpecial($this->username,$this->password);

можно сказать SOLVED

тема побеждена, надеюсь на 100%

большое спасибо ineersa