Как проверить, является ли пользователь агентом или администратором yii2

#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, я отредактирую свой ответ в свете вашего комментария.