Начал писать на Yii, буду рад советам

Господа, буду рад услышать ваши советы и критику (что я делаю неправильно).

Значит начал писать приложение (сгенерировал каркас через yiic).

В приложение будет доступ только после авторизации.

Нашел, что это можно сделать так




class Controller extends CController {


	protected function beforeAction($action) {

		parent::beforeAction($action);


		$url = $this->id . '/' . $action->id;

		$lurl = is_array(Yii::app()->user->loginUrl) ? Yii::app()->user->loginUrl[0] : Yii::app()->user->loginUrl;

		$lurl = ltrim($lurl, '/');

		if (Yii::app()->user->isGuest && $url !== $lurl) {

			Yii::app()->user->loginRequired();

		}

		return true;

	}

}



Создал контроллер авторизации




class AuthController extends Controller {


	public $layout = '//layouts/loginForm';


	/**

	 * Displays the login page

	 */

	public function actionLogin() {

		$model = new LoginForm;


		// if it is ajax validation request

		if (isset($_POST['ajax']) && $_POST['ajax'] === 'login-form') {

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}


		// collect user input data

		if (isset($_POST['LoginForm'])) {

			$model->attributes = $_POST['LoginForm'];

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

			if ($model->validate() && $model->login())

				$this->redirect(Yii::app()->user->returnUrl);

		}

		// display the login form

		$this->render('login', array('model' => $model));

	}


	public function actionLogout() {

		Yii::app()->user->logout();

		$this->redirect(Yii::app()->homeUrl);

	}

}



В контроллере авторизации переопределил $layout = ‘//layouts/loginForm’;

В этом макете отображается только форма авторизации, больше на странице ничего нет.

После авторизации пользователь попадает в закрытую часть




class SiteController extends Controller {} //стандартный код сгенерированный yyic



Так вот. Когда я только сгенерировал каркас приложения, все работало очень быстро.

Сейчас, когда уже немного переделал, как-то страницы заметно загружаться начали. А я ведь в принципе ничего еще и не сделал.

Скажите, может я что-то непраильно делаю (из того, что я показал)?

Да, и еще, работаю с собственной темой (themes/sd-theme).

Что за шаманство в beforeAction()? Вы гайд до конца прочитали? :)

Оказалось не внимательно прочитал. Спасибо, буду пробовать.

Я правильно понял, мне просто в моем Controller нужно добавить


public function accessRules()

?

Да, плюс фильтр "accessControl", через нужно который запретить доступ ко всем действиям, кроме логина.

Спасибо за помощь, вроде получилось.

Значит добавил я фильтр и правило:




public function filters() {

	return array(

		'accessControl',

	);

}


public function accessRules() {

	return array(

		array('allow',

			'actions' => array('login'),

			'users' => array('?'),

		),

	);

}



Срабатывает фильтр и в соответствии с правилом, если пользователь анонимный, его перебрасывает на страницу авторизации.

Я так понимаю, что это уже верный подход?

А если я использую контроль доступа на основе ролей, должно быть какое-то другое решение или данное решение подходит в любом случае?

P.S.

Я использую контроль доступа на основе ролей с менеджером CDbAuthManager.

В accessControl можно указать много чего, в т.ч. и список ролей пользователей, которым разрешен доступ. Но раз вы решили использовать RBAC, то наверняка в контроллерах появятся выражения вроде Yii::app()->user->checkAccess(‘someAction’), где будет осуществляться более “точная” проверка.

Читайте мануал/wiki, разбирайтесь в API, посетите русскоязычный ресурс (статья про RBAC); всё, что там написано - правильно (как правило :D).

Да, в контролеерах будут проверки на наличие прав. Ну у меня получается авторизированный пользователь будет иметь доступ как минимум к одному разделу, на просмотр своих записей. Поэтому текущая проверка через вильтры мне подходит.

Я читаю документацию, стараюсь поглядывать в исходинки (при необходимости), потихоньку учусь. Но советы профессионалов всегда полезны, вот как ваши советы к примеру.

Спасибо вам большое за помощь.

Здрасти ребята! подскажите новичку:

  1. например нужна страница для входа, а все остальные, необходимы только для авторизированных пользователей ? Лучше всего что использовать просто проверку в кадом action или rules применить? и как это будет выглядеть?

  2. до этого писал на Битрикс, там все действия по извлечению данных проводились в компоненте, а тут где их лучше проводить?

  3. Можно ли как-то разделить что б для админа был один набор экшенов, для остальных другие ? Я так понимаю это можно написать просто разные котроллеры и доступ по роялм?

Я в базовом контроллере определил следующие правила




public function accessRules() {

	return array(

		// Разрешаем анонимным пользователям действие "авторизация"

		array('allow',

			'actions' => array('login', 'error'),

			'users' => array('?'),

		),

		// запрещаем аутентифицированным пользователям действие "авторизация"

		array('deny',

			'actions' => array('login'),

			'users' => array('@'),

		),

		// запрещаем анонимным пользователям все действия

		array('deny',

			'users' => array('?'),

		),

	);

}



т.е., без авторизации никакие страницы (действия недоступны).

По поводу извлечения данных, если я правильно понял, то исходя из концепции MVC данные действия должны производиться в модели.

Спасибо madmis

Я как раз в правилах чет такое и навоял :)

но еще не проверял как работает

Да я уже понял просто не понятно было в какой из моделей, но сделал из тех которе от ActiveRecord

Ну например из примера по умолчанию

Что б выбрать всех Пользователей добавил статический метод

public static function userList($current=0,$limit=null)

{

}

или это не верно?

Ну на этот вопрос отвечать не буду, т.к. сам пока с этим знаком плохо. Могу только запутать или чего-то неправильного насоветовать.

Тут нужны советы "профи" с опытом. Я и сам не против услшать мнение знающих людей. Подождем, может кто-то и ответит.