`
hudeyong926
  • 浏览: 2017065 次
  • 来自: 武汉
社区版块
存档分类
最新评论

YII 存放登录信息的类

 
阅读更多

如果在用户登录后想额外调用除 user,id之外的数据库变量,可以这样设置:

在登陆验证时候增加额外项:

在UserIdentity.php中

class UserIdentity extends CUserIdentity{
    $this->setState('last_login_time',$user->last_login_time);
}

如此,在应用程序的任何地方,这个属性可以通过如下获取:Yii::app()->user->getState('last_login_time')

再重新登录看看,

public function setState($key, $value, $defaultValue = null) {
    $key = $this->getStateKeyPrefix() . $key;
    if ($value === $defaultValue)
        unset($_SESSION[$key]);
    else
        $_SESSION[$key] = $value;
}

其实他将信息放到session中了

其中的user是yii的一个components.需要在protected/config/main.php中定义

'user'=>array(
        // enable cookie-based authentication
        'allowAutoLogin'=>true,
        'loginUrl' => array('site/login'),
),

通过扩展CWebUser添加信息到Yii:app()->user

步骤:1、添加$user属性到UserIdentity类。 添加getUser()方法-getter上面这个属性。加setUser($user)方法-setter上面这个属性,它可以赋值给user的信息通过$user这个属性。

用户信息存到数据库表里
我的UserIdentity类例子:

<?php
class UserIdentity extends CUserIdentity {
    /**
     * User's attributes
     * @var array
     */
    public $user;

    public function authenticate() {
        $this->errorCode = self::ERROR_PASSWORD_INVALID;
        $user = User::model()->findByAttributes(array('email' => CHtml::encode($this->username)));
        if ($user) {
            if ($user->password === md5($user->salt . $this->password)) {
                $this->errorCode = self::ERROR_NONE;
                $this->setUser($user);
            }
        }
        unset($user);
        return !$this->errorCode;
    }

    public function getUser() {
        return $this->user;
    }

    public function setUser(CActiveRecord $user) {
        $this->user = $user->attributes;
    }
}

?> 

现在用户的属性已经设置,创建WebUser类并把它放在/protected/components

<?php
class WebUser extends CWebUser {
    public function __get($name) {
        if ($this->hasState('__userInfo')) {
            $user = $this->getState('__userInfo', array());
            if (isset($user[$name])) {
                return $user[$name];
            }
        }
       //this method can user Yii::app()->user->{$user的attribute}
        return parent::__get($name);
    }

    public function login($identity, $duration) {
        $this->setState('__userInfo', $identity->getUser());
        parent::login($identity, $duration);
    }

    public function getIsGuest() {
        $customer = Yii::app()->session->get('customer');
        return $customer === null || $customer['id'] === null;
    }
}
?>

 记得设置一下这个类Yii::app()->user

<?php
'components'=>array(
    'user'=>array(
        'class'=>'WebUser',
    )
)
?> 

调用方法

Yii::app()->user->getIsGuest()

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

 

2用户信息存到单独的文件

<?php
class WebUser extends CWebUser
{
    public function getReturnUrl($defaultUrl=null)
    {   
        $userInfo = $this->getUserInfo();
        if(isset($userInfo['url'])){
            return $userInfo['url'];
        }
        return parent::getReturnUrl($defaultUrl);
    }

    protected function afterLogin($fromCookie)
    {
        parent::afterLogin($fromCookie);
        $users = require(dirname(__FILE__) . '/../config/password.php');

        $this->setState('userInfo',$users[$this->getName()]);
    }

    public function getUserInfo()
    {
        return $this->getState('userInfo',array());
    }
//accessRules  roles
    public function checkAccess($operation,$params=array(),$allowCaching=true)
    {
        $userInfo = $this->getUserInfo();
        if($userInfo['group'] == $operation){
            return true;
        }
        return parent::checkAccess($operation,$params,$allowCaching);
    }
}

 password.php

<?php

return array(
    'dianyin'           => array(
        'pwd'           => 'dianyinXX',
        'url'           => array('dianyin/order/index'),
        'merchant_id'   => 1,
        'group'         => 'dianyin',
     ),
    'boer' => array(
        'pwd'           => 'boerXX',
        'url'           =>  array('third_jifen/default/index'),
        'merchant_id'   => 1,
        'group'         => 'jifen',
    ),
);

 权限checkAccess结合roles

public function accessRules()
{
    return array(
        array('allow', // allow authenticated users to access all actions
            'roles'=>array('jifen'),
        ),
        array('allow',  // deny all users
            'actions'=>array('login','logout'),
            'users'=>array('*'),
        ),	
        array('deny',  // deny all users
            'users'=>array('*'),
        ),
    
    );
}

 

 
 
分享到:
评论
1 楼 uiexp 2012-01-09  
              

相关推荐

    yii2整合phpqrcode

    否则需要给出存放生成二维码图片的文件名及路径; 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制...

    Yii框架组件和事件行为管理详解

    CComponent几乎是所有类的基类,它控制着组件与事件的管理,其方法与属性如下,私有变量$_e数据存放事件(evnet,有些地方叫hook),$_m数组存放行为(behavior)。 组件管理 YII是一个纯oop框架,很多类中的成员变量的...

    yii-build:在php yii框架中构建javascript

    "static/modules", "jsDest": "js/modules", "checkPath": "protected/views"}参数说明:jsSrc:javascript文件路径(目前只支持单一文件夹)jsDest: release javascript文件存放路径checkPath:存在引用javascript...

    YII2框架中actions的作用与使用方法示例

    本文实例讲述了YII2框架中actions的作用与使用方法。分享给大家供大家参考,具体如下: 我们常在控制器中看到一个actions的方法,这个方法具体的作用是共用...//我们需要继承yii\base\Action类 class TestAction ext

    Yii2基于Ajax自动获取表单数据的方法

    这里有两张表,表结构如下,locations表存放的省份和邮编等信息,两张表的model和curd均使用gii生成 yii2advanced.customers表 customer_id:int(11) customer_name:varchar(100) zip_code:varchar(20) city:varchar...

    YII2 实现多语言配置的方法分享

    前言: 由于我的YII2版本是2.0.7, 设置多语言时和其他教程有...2. 手动创建一个文件夹messages来存放多语言相关文件, 如果是advanced版本则在frontend下面创建这个文件夹 3. 创建i18n配置文件 yii message/config fron

    YiiStudy:Yii框架研究心得

    #####Yii框架的路由以安全方面的研究 基础核心类共有69个 其中抽象类共有10个 接口类共有15个 其余全为动态加载 详情见: 全部类共有 208个 Yii框架目录结构 . ├── base // 底层核心类库 ├── caching // 所有的...

    YII Framework框架教程之日志用法详解

    YII中的日志很好很强大,允许你把日志信息存放到数据库,发送到制定email,存放咋文件中,意见显示页面是,甚至可以用来做性能分析。 YII中日志的基本配置:/yii_dev/testwebap/protected/config/main.php 'log'=&gt;...

    Yii框架的布局文件实例分析

    我的理解就是布局存放了视图文件中的相同代码,使用布局文件可以减少视图文件代码的冗余。下面介绍如何使用Yii的布局文件。 首先在views\layouts下面创建自己的布局文件 common.php &lt;!doctype html&gt; &lt;...

    浅析Yii2缓存的使用

    一个好的框架是肯定离不开缓存的使用,相反,一个没有缓存的框架也肯定不是一个好框架,好像是一个意思,不管了,我们先来看看...所谓的文件缓存,其实就是把我们要缓存的数据存放到文件内,那数据又缓存到哪里了呢?

    PHP生成压缩文件开发实例

    2.压缩文件存放在根目录 /upload/zipfile/年月/自定义的压缩文件名.zip 3.点击下载压缩包,系统开始对压缩文件打包,打包完成后自动开始下载 4.为了防止暴露压缩包文件路径,需要对下载的压缩包文件名改名 ...

    Phalcon 中文文档

    但YAF的缺点是,功能非常不完善,在我看来只是简单实现了MVC结构及路由,分发等功能,像一些ORM之类的功能完全没有开发,作者好像也没有开发的意思:) 后来就发现了Phalcon,一看文档就爱上了她,功能,速度等都是...

    directive.js:nodejs web mvc 框架

    directive.js full stack nodejs web mvc ...运行网站时,会首先使用less编译css,然后存放到根目录下assets文件夹下的css目录下。如果配置文档指定develop为false,则压缩后放到assets目录下。js文件也会压缩。

    WEB站点性能优化实践(加载速度提升2s)

    通过查看时间线,本站在获取HTML文档时,花费的时间不到总响应时间的20%,优化之前没有使用缓存,所有的数据都是从数据库读取,这里,我们使用静态页面缓存,将首页整个页面完全的存放在缓存中(关于YII静态页面缓存...

Global site tag (gtag.js) - Google Analytics