#php #yii2
#php #yii2
Вопрос:
Я создал свою таблицу для пользователей: PK — ID, имя пользователя, пароль, статус, роль Для ролей, которые я объявил в своей модели const ROLE_ADMIN = 1, const ROLE_VISITOR = 2;
Я хочу разрешить вход в систему, если пользователь является администратором, или отклонить вход в систему, если пользователь является посетителем. У меня будут импортированы все пользователи, но к приложению будут доступны только немногие из них, поэтому я хочу запретить вход в систему для любого другого типа пользователя.
Для этого
[
'allow' => true,
'roles' => ['@'],
],
Где я должен объявить функцию для использования вместо 'allow' => true,
'allow'=>function
и проверить, если $this->role == 1
ЗАРАНЕЕ БЛАГОДАРЮ ВАС ЗА ЛЮБЫЕ ПРЕДЛОЖЕНИЯ.
Контроллер :
<?php
namespace appcontrollers;
use Yii;
use appmodelsUser;
use appmodelsUserSearch;
use yiiwebController;
use yiiwebNotFoundHttpException;
use yiifiltersVerbFilter;
/**
* UsersController implements the CRUD actions for User model.
*/
class UsersController extends Controller
{
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
],
];
];
}
/**
* Lists all User models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new UserSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single User model.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
/**
* Creates a new User model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$model = new User();
if ($model->load(Yii::$app->request->post()) amp;amp; $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('create', [
'model' => $model,
]);
}
/**
* Updates an existing User model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) amp;amp; $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('update', [
'model' => $model,
]);
}
/**
* Deletes an existing User model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
/**
* Finds the User model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return User the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = User::findOne($id)) !== null) {
return $model;
}
throw new NotFoundHttpException('The requested page does not exist.');
}
}
Модель:
<?php
namespace appmodels;
use yiidbActiveRecord;
use yiiwebIdentityInterface;
/**
* This is the model class for table "user".
*
* @property int $id
* @property string $username
* @property string $password
* @property int $status
* @property int $role
*
* @property Equipment[] $equipments
* @property UserEquipmentMapping[] $userEquipmentMappings
*/
class User extends ActiveRecord implements IdentityInterface
{
/**
* {@inheritdoc}
*/
const STATUS_AVAILABLE = 1;
const STATUS_DISABLED = 2;
const ROLE_ADMIN = 1;
const ROLE_VISITOR = 2;
public static function tableName()
{
return 'user';
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['username', 'password', 'status', 'role'], 'required'],
[['status', 'role'], 'integer'],
[['username', 'password'], 'string', 'max' => 20],
];
}
/**
* {@inheritdoc}
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'username' => 'Username',
'password' => 'Password',
'status' => 'Status',
'role' => 'Role',
];
}
/**
* Gets query for [[Equipments]].
*
* @return yiidbActiveQuery|EquipmentQuery
*/
public function getEquipments()
{
return $this->hasMany(Equipment::className(), ['user_for_id' => 'id']);
}
/**
* Gets query for [[UserEquipmentMappings]].
*
* @return yiidbActiveQuery|UserEquipmentMappingQuery
*/
public function getUserEquipmentMappings()
{
return $this->hasMany(UserEquipmentMapping::className(), ['user_id' => 'id']);
}
/**
* {@inheritdoc}
* @return UserQuery the active query used by this AR class.
*/
public static function find()
{
return new UserQuery(get_called_class());
}
public static function findIdentity($id)
{
return static::findOne($id);
}
public static function findByUsername($username)
{
#$u = static::findOne($username);#
#print_r($username);die;
$u = User::find()
->where(['username' => $username])
->one();
return $u;
}
public function getUsername()
{
#$u = User::find()
# ->where(['username' => $username])
# ->one();
return $this->username;
#return $this->hasOne(User::className(), ['username' => 'username_id']);
}
public function getAuthKey()
{
}
/**
* @inheritdoc
*/
public function getId()
{
return $this->id;
}
public function getRole(){
return $this->role;
}
public static function findIdentityByAccessToken($token, $type = null)
{
}
public function validateAuthKey($authKey)
{
}
public function validatePassword($password)
{
return $this->password === $password;
}
/* public function rules()
{
return array(
array('last_name','first_name','age','username','password', 'safe'),
);
}
*/
}
Комментарии:
1. Почему тег <sql>? (Я не вижу SQL выше. Вам нужен ответ SQL?)
2. извините за тег <sql>, я думал, что это может помочь. я удалил его
Ответ №1:
Если вы пытались разрешить один набор действий для «обычных» пользователей и один для администраторов, то, возможно, стоит проверить Расширенный шаблон, который позволит вам распределять разрешения отдельно во внешнем интерфейсе и бэкэнде. Однако, если я понимаю ваш комментарий в ответ на первую версию этого ответа, то на самом деле вы намереваетесь импортировать полный набор пользователей из другого контекста (Active Directory), а затем предоставить некоторым из них доступ администратора к вашему приложению Yii2.
Вы говорите, что хотите разрешить вход в систему, если пользователь является администратором, или отклонить вход в систему, если пользователь является посетителем, что все еще немного двусмысленно. На самом деле вы не имеете в виду, что не-администраторы просто гости (термин, используемый Yii)?
Если посетители не могут войти в систему, то их невозможно отличить друг от друга, и вам не нужно — на самом деле я бы предположил, что вам, вероятно, не следует — хранить их в той же таблице, что и ваши администраторы. Вероятно, вам было бы лучше просто назначить логины своим администраторам и управлять ими с помощью кода, который вы опубликовали выше: 1) контроллер для действий и 2) ваш интерфейс идентификации, плюс /models/LoginForm.php .
Затем вы должны создать отдельную таблицу для пользователей Active Directory, в комплекте с ее собственной моделью, представлениями и контроллером, в рамках которой вы бы дали своим администраторам разрешение на выполнение функций CRUD для этих записей.
Вам нужно действие в одном из ваших контроллеров для отображения формы входа, и в базовом шаблоне есть готовый шаблон, модель которого models/LoginForm.php , и именно там вы можете наиболее легко написать / изменить код для входа администраторов (и потенциально игнорировать «обычных» пользователей / посетителей).. Однако, если вы разделите таблицы, это будет работать из коробки — потому что в таблице, на которую он ссылается, будут только ваши администраторы.
Затем вы можете использовать поведение в контроллерах, чтобы разрешить или запретить доступ к различным уровням пользователей (ролей). Здесь есть хороший учебник. Обратите внимание, что синтаксис поведения для гостей — это знак вопроса (в отличие от символа @ для аутентифицированных пользователей). Хороший совет здесь — не смешивать общедоступные и доступные только администратору действия в одном контроллере, потому что это упрощает необходимый код поведения.
Последнее, что я хотел бы предложить, это то, что, если вы собираетесь использовать иерархию разрешений, вам следует изменить уровни разрешений пользователя (константы) в порядке, противоположном тому, который вы использовали — чем выше значение, тем больше разрешений. Я склонен использовать 7-уровневую систему (фактически 6 1, где 0 — это отсутствие каких-либо разрешений, а 6 — суперпользователь), но в сочетании с набором систем, чтобы у пользователей были разрешения на систему. Этого было достаточно для каждой системы, которую я построил или над которой работал, но звучит чрезмерно для ваших нужд.
В целом, похоже, что вы можете добиться желаемого с помощью администраторов в таблице, используемой IdentityInterface, пользователей Active Directory в другой таблице и простого разграничения гостя / аутентифицированного пользователя.
Комментарии:
1. Здравствуйте, спасибо за ваш ответ. Я намерен импортировать пользователей из Active Directory, но только несколько человек будут иметь доступ к приложению. Итак, я хочу разрешить вход только небольшой части всего списка пользователей. Я хочу разрешить доступ только к тем, у которых есть ROLE_ADMIN, имея столбец в моей базе данных пользователей с ролью. Я хочу этого, потому что мне нужны все пользователи для области применения приложения.
2. @Liviu, я отредактирую свой ответ в свете вашего комментария.