【问题标题】:Yii2 AccessControlYii2 访问控制
【发布时间】:2016-01-01 07:18:14
【问题描述】:

我是 Yii2 的新手,我尝试制作 AccessControl 并取得成功 但问题是在我成功登录并重定向到其他页面之后 我的 Identity _attributes 始终为 null。因此,如果我检查 Yii::$app->user->isGuest,则返回值始终为 true

这是我的 LoginHandler.php

<?php
namespace app\models;

use Yii;
use yii\base\Model;

/**
 * Login form
 */
class LoginHandler extends Model
{
    public $user_name;
    public $user_password;
    public $rememberMe = true;

    private $_user;


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
           [['user_name', 'user_password'], 'required'],
            [['user_name', 'user_password'], 'string', 'max' => 100],
            ['user_password','authenticate'],
        ];
    }

    public function authenticate($attribute, $params){
//      return true;
    } 

    public function login()
    {

        if ($this->validate()) {
            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);            
        } else {
            return false;
        }
    }

    protected function getUser()
    {
        if ($this->_user === null) {
            $this->_user = User::findByUsername($this->user_name);
        }
        return $this->_user;
    }
}

登录控制器

    <?php

namespace backend\controllers;
use Yii;
use app\models\user;
use app\models\LoginHandler;

class LoginController extends \yii\web\Controller
{
    public function actionIndex()
    {
        return $this->render('index');
    }

    public function actionSignin(){     
        $user = User::findByUsername('admin');
        $model = new LoginHandler();
        if(Yii::$app->request->post()){
            $data = Yii::$app->request->post();
            $model->attributes = $data;
            if ($model->login()) {
                return $this->redirect(['/user/test']);
            }else{
                die('test');
            }

        }
        return $this->render('login');
    }

}

我的 User.php 作为模型

    namespace app\models;
    use Yii;

    /**
     * This is the model class for table "user".
     *
     * @property integer $user_id
     * @property string $user_name
     * @property string $user_password
     */
    class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface{

        public $id;
        public $authKey;

        /**
         * @inheritdoc
         */
        public static function tableName()
        {
            return 'user';
        }

        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [['user_name', 'user_password'], 'required'],
                [['user_name', 'user_password'], 'string', 'max' => 100]
            ];
        }

        /**
         * @inheritdoc
         */
        public function attributeLabels()
        {
            return [
                'user_id' => 'User ID',
                'user_name' => 'User Name',
                'user_password' => 'User Password',
            ];
        }

        public static function findIdentity($id)
        {
            return static::findOne($id);
        }

        public static function findIdentityByAccessToken($token, $type = null)
        {
            return static::findOne(['access_token' => $token]);
        }

        public function getId()
        {
            return $this->id;
        }

        public function getAuthKey()
        {
            return $this->authKey;
        }

        public function validateAuthKey($authKey)
        {
            return $this->authKey === $authKey;
        }

        public static function findByUsername($username){
            return static::findOne(['user_name' => $username]);
        }
    }

最后是我的配置main.php

    <?php
$params = array_merge(
    require(__DIR__ . '/../../common/config/params.php'),
    require(__DIR__ . '/../../common/config/params-local.php'),
    require(__DIR__ . '/params.php'),
    require(__DIR__ . '/params-local.php')
);

return [
    'id' => 'app-backend',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'backend\controllers',
    'bootstrap' => ['log'],
    'modules' => [],
    'components' => [
        'user' => [
            'identityClass' => 'backend\models\User',
            'loginUrl'  => ['login/signin'],
            'enableAutoLogin' => true,
        ],      
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
    ],
    'params' => $params,
];

提前致谢。

【问题讨论】:

  • 为什么在 app\models 命名空间中定义用户模型时,配置中有 'backend\models\User'?
  • 如果我在配置中更改为 app\models 仍然无法正常工作
  • 您使用的是哪个模板,您在哪里调用Yii::$app-&gt;user-&gt;isGuest
  • 似乎您的会话 cookie 配置不正确。向我们展示您的 common/config/main.php、common/config/main-local.php 和 config/main-local.php 文件。
  • 两项:1)get_class_methods(\Yii::$app-&gt;user);返回什么? 2) 为了一致性起见,建议遵循代码风格指南。 (个人推荐是 PSR 的。)

标签: php authentication login yii2


【解决方案1】:

您在问题中提到了AccessControl。 Yii2 AccessControl 是一个特殊的行为类来管理控制器内部的访问规则:

http://www.yiiframework.com/doc-2.0/yii-filters-accesscontrol.html

我在你的代码中没有看到AccessControl

无论如何。

很可能问题出在您的 User 类的实现中。 查看您的代码,我可以想象表结构是:user_id (PK), user_name, user_password。 如果是这样,那么方法getId() 返回变量 ($this-&gt;id) 从未初始化。但是这个方法被 Yii 用来在 session 中存储当前用户。在您的情况下,它应该返回$this-&gt;user_id

如果你想让remember me 工作,你也应该正确实现getAuthKeyvalidateAuthKey

详情如下: http://www.yiiframework.com/doc-2.0/guide-security-authentication.html

如果这没有帮助,请显示您的表结构和视图代码,它们将身份验证数据传递给LoginController

【讨论】:

    【解决方案2】:

    看起来你应该检查一下

    Yii::$app->user->identity
    

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多