Yii前后台分离及登陆验证

比较合理的做法其实是分成两个框架来布署;然而这样说法也太绝对。

事实上是针对不同系统,应采用不同的方法。如为CMS系统,则不需很复杂的权限管理,但如果有管理员与会员之分,系统又有很多设置操作,则需要前后台分离,并设置相应的权限管理。

大型的系统或是为安全因素考虑,则是布署成两个目录。

但一般的小型应用则不需要这样。

按照官方的cookebook有两种方法可选:一是modules,二是两个config。

modules的方法可参照boylee的教程,google yiigo即可。

这里是参照第二种方法来做的。

论坛上有人建议做一个主config.php然后使用CMap::mergeArray()将两个配置文件合并,好处是省事,配置方便。

但通常,前后台各有其配置。我这里采用了官方的方法,即前后台各使一个config,并不合并。便宜之处是前后台皆可使用gii(gii是yii的一大特色,工欲善其事,必先利其器,如果丢掉这么好的工具不用,有些可惜),另外便于操作,即便是新手也很容易配置。

现在将实现方法向大家汇报如下:

具体实现步骤:

一,建立入口

首先使用yiic 建立项目;其次,修改webroot 下的index-test.php,将其命名为admin.php(根据项目改名,此处只举例而已,不要认真,认真你就输了)。

修改admin.php

/**
 * This is the bootstrap file for test application.
 * This file should be removed when the application is deployed for production.
 */

// change the following paths if necessary
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/admin/config/main.php';

// remove the following line when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);

require_once($yii);
Yii::createWebApplication($config)->run();

ps:因为我将yii移到了项目之外,所以配置请以具体环境为准,此例仅做参照。

二、建立配置文件

在protected目录下建立admin目录,然后将protected下的config里的main.pphp拷贝过来;在admin目录依次建立controllers,models,views目录;然后将protected下的site相关目录考贝过来,放在相应层次。参考主目录结构建立如下:

admin  
|-- config  
|   `-- main.php  
|-- controllers  
|   `-- SiteController.php  
|-- models  
|   |-- ContactForm.php  
|   |-- LoginForm.php  
|   `-- Operator.php  
|-- runtime  
|   |--  
`-- views  
|-- layouts  
|   |-- column1.php  
|   |-- column2.php  
|   `-- main.php  
`-- site  
|-- contact.php  
|-- error.php  
|-- index.php  
|-- login.php  
`-- pages  
`-- about.php

ps:对于类linux系统请不要忘记修改相应的目录、文件权限。

三、修改配置admin/config/main.php参考如下:

<?php

// 这里使用了一个扩展,故定义了一个别名
Yii::setPathOfAlias('ext', dirname(__FILE__).'/../extensions');
// 下面是分离前后台需要增加的
$backend=dirname(dirname(__FILE__));
$frontend=dirname($backend);
Yii::setPathOfAlias('backend', $backend);

// 下面是通用配置
return array(
    // 着重注意修改的地方
    'basePath' => $frontend,
    'controllerPath' => $backend.'/controllers',
    'viewPath' => $backend.'/views',
    'runtimePath' => $backend.'/runtime',;
    'name'=>'后台管理程序',

    // preloading 'log' component
    'preload'=>array('log'),

    // autoloading model and component classes
    'import'=>array(
        'application.models.*',
        'application.components.*',
        // 着重注意修改的地方
        'backend.models.*',
        'backend.components.*',;
        'ext.*',ext
    ),

    'modules'=>array(
        //  Gii tool
        'gii'=>array(
            'class'=>'system.gii.GiiModule',
            'password'=>'password',
            'generatorPaths'=>array(
                'ext.dwz.gii.module.templates.dwz.module',
            ), 
            // If removed, Gii defaults to localhost only. Edit carefully to taste.
            'ipFilters'=>array('127.0.0.1','::1'),
        ),

    ),

    // application components
    'components'=>array(
        'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
        ),
        // uncomment the following to enable URLs in path-format
        /*
        'urlManager'=>array(
            'urlFormat'=>'path',
            'rules'=>array(
                '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ),
        ),
         */

        // MySQL database

        'db'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=dbname',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ),

        'errorHandler'=>array(
            // use 'site/error' action to display errors
            'errorAction'=>'site/error',
        ),
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error, warning',
                ),
                // uncomment the following to show log messages on web pages
                array(
                    'class'=>'CWebLogRoute',
                ),
            ),
        ),
    ),

    // application-level parameters that can be accessed
    // using Yii::app()->params['paramName']
    'params'=>array(
        // this is used in contact page
        'adminEmail'=>'webmaster@example.com',
        'loginType'=>'',
    ),
);

ps:请不要照抄,跟据实际情况调整,另注意web页面的转义。另,注意着重修改的地方。

四、生成后台model

因为import里导入了前后台的models因此,在后台可以使用前后台所有models。

下面利用yii神器GII,http://domain/admin.php?r=gii/model

请注意下图:

这里可以选择要生成的models的位置,默认的是applications.models。其实,一个gii也可以生成前后台models但用起来稍闲麻烦。

五、实现前后台登陆

验证部分不说了,修改UserIdentity.php和用户模型。具体可参考这里

主要的是在config/main.php里的params里增加了‘logintype’参数,用于标识登陆用户类型。这里是急中生智的办法,希望大侠们提出更好的方法。

发表评论