RBAC - role based access control, зачем там пароли?)
Пароли и логины используются для аутентификации пользователей, а не для распределения доступа.
Аутентификация делается при помощи унаследования класса UserIdentity и переписывания функции authenticate(). Тут по сути не особо имеет значение где находятся логины и пароли. Пропишите чтобы они брались из файла и проверялись с введенными вместо того чтобы брать их из БД.
Далее после аутентификации у пользователя будет роль. По роли и проверяется есть ли доступ к определенным действиям и т.п.
Единственное что можно украсить - это написать модель для работы с файлом. Писал подобное для работы с конфигами, если интересно вот gist https://gist.github.com/ineersa/6410546
Ну по сути все тоже самое как и в обычной аутентификации:
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() - которая вернет массив со значениями из строки.