YII学习笔记-登录后的session的总结

2020-02-08 13:36栏目:编程
TAG:

附件2:AdminWebUser.php代码

二、定义模型与查询数据

1、定义模型

位置:protected/models/

名称:admin.php

内容:模型必须有两个方法 —— model() 与 tableName(),如下。

class Admin extends CActiveRecord{
  // 必需方法1。返回模型
  public static function model($className = __CLASS__){
    return parent::model($className);
  }

  // 必须方法2。返回表名
  public function tableName(){
    return "{{admin}}"; //返回yii_admin表名
  }
}

 

2、查询

举个栗子,在控制器中调用用户信息:

Admin::model()->find('username = :name' , array(':name => 'admin'));

对于返回的数据,建议打印出来看一下,方便操作每个字段。

 

注意:Yii的 ActiveRecord 基类模型采用了对象化,表映射到模型,记录映射到对象,表或记录的字段映射到模型或对象的属性,所以用访问属性的方法可以访问到字段。

 

   'sessionName'=>'Site Access',

附件1:WebUser.php代码:

三、登录验证

将操作以下两个文件:

protected/models/LoginForm.php

protected/components/UserIdentity.php

参照源码进行修改即可。

 

1、控制器中执行:

$loginForm = new LoginForm();

$loginForm()->login();       // 进行登录验证

 

注意:LoginForm 是 Yii 默认带有的一个登录模型,这个模型可以对登录表单进行验证,可以修改为映射到后台用户表的 admin 模型,强迫症可以改为 admin.php,实例化的时候 new Admin() 就行。

/**
 * 登录视图及登录表单处理
 * @return [type] [description]
 */
public function actionIndex(){
    $loginForm = new LoginForm(); // 实例化LoginForm

    // 登录表单处理
    if(isset($_POST['LoginForm'])){
        $loginForm->attributes = $_POST['LoginForm']; // 压入需要验证的POST数据

        if($loginForm->validate() && $loginForm->login()){ //验证通过
            Yii::app()->session['logintime'] = time(); //写session,记录当前登录时间

            $this->redirect(array('default/index'));
        }
    }

    $this->render('index', array('loginForm' => $loginForm)); //渲染模板(没有布局),分配模板变量loginForm模型
}

  

2、在 LoginForm模型中,rules() 方法定义规则:

public function rules()
{
  return array(
    array('password', 'authenticate'), //自定义 authenticate()方法验证
  );
}
public function authenticate($attribute, $params)
{
  if(!$this->hasErrors())
  {
    $this->_identity = new UserIdentity($this->username, $this->password); 
    if(!$this->_identity->authenticate())
    $this->addError('password','用户名或密码错误');
  }
}

 

3、UserIdentity 类进行判断与返回错误

这是它的authenticate()方法,辅助上面LoginForm模型中的authenticate()方法进行密码验证

public function authenticate()
{
  $user= User::model()->find('username = :name', array(':name' => $this->username));

  if(!$user){                                       // 用户名错误
    $this->errorCode = self::ERROR_USERNAME_INVALID;
  }
  else if($user->password != md5($this->password)){ // 密码错误
    $this->errorCode = self::ERROR_PASSWORD_INVALID;
  }
  else{
    $this->errorCode = self::ERROR_NONE;           // 验证通过
  }
  return !$this->errorCode;                         // 真通过,假失败
}

   

获取用户的session ID

在你用Gii生成一个admin模块时,会在module->admin下生成一个AdminModule.php文件,该类继承了CWebModule类,下面给出这个文件的代码,关键之处就在该文件,望大家仔细研究:

六、URL跳转与生成

URL跳转:

  $this->redirect(array('控制器名/方法名'));

URL生成:

  在视图中调用,$this->createUrl('控制器/方法', array('id' => 2));

 

首先我们来试着修改id这样数据。

附件3:前台UserIdentity.php代码

一、数据库连接

1、配置连接参数

在database.php里面开启:

'db' => array(
  'connectionString' => 'mysql:host=127.0.0.1;dbname=blog',
  'emulatePrepare' => true, // PDO扩展
  'username' => 'root',
  'password' => '',
  'charset' => 'utf8',
  'tablePrefix' => 'yii_', // 表前缀
  'enableParamLogging' => true // 开启SQL调试信息
),

 更多配置在 framework/db/CDbConnection.php中 可以找到

 

2、测试连接

用 var_dump(Yii::app()->db);可以测试数据库是否连接成功

 

你会发现id和那么的数据都是admin,也就是说,其实yii就只为我们提供了一个用户名就作为用户凭证。我们更多的时候需要用session来记录更多的用户凭证,比如都用户的权限等。

因为最近在做一个项目涉及到前后台登录问题,我是把后台作为一个模块来处理的。我看很多人放两个入口文件index.php和admin.php,然后分别指向前台和后台。这种方法固然很好,可以将前后台完全分离,但我总觉得这种方式有点牵强,这和两个应用啥区别?还不如做两个App用一个framework更好。而且Yii官方后台使用方法也是使用Module的方式。但是Moudle的方式有一个很头疼的问题,就是在使用Cwebuser登录时会出现前后台一起登录一起退出的问题,这显然是不合理的。我纠结了很久才找到下文即将介绍的方法,当然,很多也是参考别人的,自己稍作了改动。我一开始的做法是在后台登录时设置一个isadmin的session,然后再前台登录时注销这个session,这样做只能辨别是前台登录还是后台登录,但做不到前后台一起登录,也即前台登录了后台就退出了,后台登录了前台就退出了。出现这种原因的根本原因是我们使用了同一个Cwebuser实例,不能同时设置前后台session,要解决这个问题就要将前后台使用不同的Cwebuser实例登录。下面是我的做法,首先看protected->config->main.php里对前台user的配置:

五、Session使用

存储:

  Yii::app()->session['logintime'] = time();

调用:

  Yii::app()->session['logintime']

清除:

  Yii::app()->session->clear();

  Yii::app()->session->destory();

退出登录:

  Yii::app()->user->logout(); //退出登录,清除SESSION

 

 

public function login()
    {
        if($this->_identity===null)
        {
            $this->_identity=new UserIdentity($this->username,$this->password);
            $this->_identity->authenticate();
        }
        if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
        {
            $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
            Yii::app()->user->login($this->_identity,$duration);
            return true;
        }
        else
            return false;
    }
/*** Clears all user identity information from persistent storage. * This will remove the data stored via {@link setState}. */public function clearStates(){ $keys=array_keys; $prefix=$this->getStateKeyPrefix; foreach { if(!strncmp unset; }}

四、登录信息调取

Yii::app()->user->name; // 登录后存储在 session 中的用户名

注意前后台用户区分,需要设置:(以后台模块 admin 为例)

在 modules/admin/AdminModule.php 文件中的 init() 方法添加代码:

Yii:app()->setComponents(array(
  'user' => array('stateKeyPrefix' => 'admin')
));

 

    'connectionID' => 'db',

hasState { $user=$this->getState); if  { return $user[$name]; } } return parent::__get; } public function login { $this->setState('__adminInfo', $identity->getUser; parent::login; }}?>

 

errorCode=self::ERROR_PASSWORD_INVALID; $user=User::model()->find('username=:username',array(':username'=>$this->username)); if  { $encrypted_passwd=trim; $inputpassword = trim; if($inputpassword===$encrypted_passwd) { $this->errorCode=self::ERROR_NONE; $this->setUser; $this->_id=$user->id; $this->username=$user->username; //if->user->thisisadmin)) // unset ->user->thisisadmin); } else { $this->errorCode=self::ERROR_PASSWORD_INVALID; } } else { $this->errorCode=self::ERROR_USERNAME_INVALID; } unset; return !$this->errorCode; } public function getUser() { return $this->user; } public function getId() { return $this->_id; } public function getUserName() { return $this->username; } public function setUser { $this->user=$user->attributes; }}
       public function getPersistentStates()
    {
        return array("a"=>"b");
    }
    public function getId() {
            return 10;
        }

AdminModule 的init()方法就是给后台配置另外的登录实例,让前后台使用不同的CWebUser,并设置后台session前缀,以便与前台session区别开来(他们同事存在$_SESSION这个数组里,你可以打印出来看看)。

<?php
    session_start();
    print_r($_SESSION);
?>

看到没,就是利用匹配前缀的去注销的。

首先配置main.php文件

errorCode=self::ERROR_PASSWORD_INVALID; $user=Staff::model()->find('username=:username',array(':username'=>$this->username)); if  { $encrypted_passwd=trim; $inputpassword = trim; if($inputpassword===$encrypted_passwd) { $this->errorCode=self::ERROR_NONE; $this->setUser; $this->_id=$user->id; $this->username=$user->username; // Yii::app()->user->setState("thisisadmin", "true"); } else { $this->errorCode=self::ERROR_PASSWORD_INVALID; } } else { $this->errorCode=self::ERROR_USERNAME_INVALID; } unset; return !$this->errorCode; } public function getUser() { return $this->admin; } public function getId() { return $this->_id; } public function getUserName() { return $this->username; } public function setUser { $this->admin=$user->attributes; }}

'session' => array (

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

  在YII框架的默认的登录后的session数据是id,name,__states这三个数据。

Yii::app()->user //前台访问用户信息方法Yii::app()->admin //后台访问用户信息方法

我们最好不要改动framework文件的内容。所以我们改动传进去的数据,也就是UserIdentity这个类。

'user'=>array( 'class'=>'WebUser',//这个WebUser是继承CwebUser,稍后给出它的代码 'stateKeyPrefix'=>'member',//这个是设置前台session的前缀 'allowAutoLogin'=>true,//这里设置允许cookie保存登录信息,一边下次自动登录),

在YII中不用自己使用session_start()来开启session,yii本身已经开启。

本文实例讲述了Yii中实现处理前后台登录的新方法。分享给大家供大家参考,具体如下:

 

这样就已经做到了前后台登录分离开了,但是此时你退出的话你就会发现前后台一起退出了。于是我找到了logout()这个方法,发现他有一个参数$destroySession=true,原来如此,如果你只是logout()的话那就会将session全部注销,加一个false参数的话就只会注销当前登录实例的session了,这也就是为什么要设置前后台session前缀的原因了,下面我们看看设置了false参数的logout方法是如何注销session的:

'session'=>array(

版权声明:本文由bob体育app发布于编程,转载请注明出处:YII学习笔记-登录后的session的总结