您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 08_第七章:迭代4:用户管理和权限认证
第七章:迭代4:用户管理和权限认证在前面很短的时间内,我们完成了大量开发工作。Trackstar应用程序基本功能的基础已经奠定。目前为止,我们已经有能力去管理该项目和其中存在的问题,而这个能力正是Trackstar应用程序需要实现的首要目标。当然,还有许多事在向我们招手。请回顾一下第三章,当时我们介绍这一应用程序的时候,我们将它描述为基于角色的应用程序,它允许建立用户帐号,一旦用户获得授权并且通过认证就可以使用一些功能。为了让这个应用程序比单用户系统更有用,我们需要添加基于项目的用户管理能力。下述2次迭代会完成这一功能。迭代计划最初我们使用yiic命令行工具建立我们的Trackstar应用程序时,我们注意到(Yii)系统已经自动为我们创建了基础登录功能。当前登录页面只能使用2对帐号/密码进行登录(demo/demo和admin/admin)。你或许还记得,我们必须在登录的情况下,才可以对项目和相关问题进行CRUD操作。这些用于认证的基础脚手架代码,确实为我们提供了一个好的开端,但是我们需要进行一定的修改,使之支持更多的用户。同时我们需要向应用程序添加用户CRUD功能,用来对多用户进行管理。这次迭代聚焦在使用User表扩展认证模型,和适当添加基本用户数据管理所需功能。为了达到上述目标,我们需要确定所有在本次迭代将要实现的细节。以下列表中列出了这些细节:建立一个用于存放所有我们需要功能的Controller(控制器)类:o建立新用户o从数据库获取一列已存在用户信息o更新/编辑已存在用户信息o删除已存在用户建立ViewFile(视图文件)和呈现层逻辑,用来:o显示用于建立新项目的表单o用列表显示所有已存在项目o显示授予某一用户权限,去编辑一个已存在项目的表单o为项目列表添加一个删除按钮,实现删除项目调整新建用户表单,使之可以被用于外部用户自助注册修改认证流程,使用数据库来认证用户登录信息运行测试套件在我们添加新功能之前运行一下测试套件绝对是一个好注意。测试套件包括之前每一次迭代,包括我们为应用添加的代码,也包括我们所添加过的测试套件。随着测试套件的增多,我们的应用程序向我们反馈其健壮程度的能力也在不断增长。在我们进行改变前,请确保一切工作如常。从测试文件包(/protected/tests/)运行一次单元测试:SHELL代码或屏幕回显:%phpunitunit/PHPUnit3.4.12bySebastianBergmann...........Time:0secondsOK(10tests,26assertions)一切都那么美好,让我们尽情的投入这次迭代。创建用户CRUD由于我们正在建立一个基于用户的Web应用,我们必须有添加和管理用户的方式。在第6章我们添加了表tbl_user到我们的数据库。你可能记得,我们将它作为一个练习(建立与之相关的AR模型类)留给读者。如果你还没有建立这个类,你需要现在建立它。使用Gii代码创建工具,新建一个模型类的简要提示。通过=gii打开Gii工具并点击ModelGenerator连接,设置表前缀为tbl_。在TableName输入框填入tbl_user,ModelClass输入框会自动填入User。当表单填写完成,点击Preview按钮,可以得到一个可以弹出将要生成代码情况的连接。然后点击Generate按钮来确定在/protected/models下生成一个新User.php模型类文件。伴随UserAR类的完成和基于以前从Gii操作中获得的经验,建立CRUD脚手架就是小菜一碟。以下作为一个简单的回顾:1.打开=gii2.在可选生成器列表中点击CrudGenerator连接3.在ModelClass框输入User,ControllerID框将会自动写入user.点击Preview按钮后你可以预览到将要生成的代码,确认后,点击Generate按钮,所有相关CRUD文件都会被自动生成在预定好的位置。当上述被完成后,我们可以在=user浏览我们的用户列表。在上一次迭代中,我们手动添加了一些用户进入系统,所以接下来我们可以控制项目,项目中的问题和用户之间的关系了。所以在上述地址我们可以看到一些用户的显示。下面的截图向我们展示了用户列表页面的样子:我们也可以通过=user/create来访问新建用户表单。如果目前你未登录,你将被引导至登录页面,登录后才可显示新建表单。使用demo/demo或admin/admin帐号密码都在这里使用。从第一次在Project上使用CRUD操作,到后来的Issue,我们对于这些功能如何在Gii代码生成器下执行已经非常熟悉了。那些输入框提供的新建和更新操作是一个不错的开始,不过通常需要进行一些特殊的修改来达到预期的项目需求。在新建用户表单时,这个原则一样适用。每一个tbl_user表中定义的列,都有一个输入框与之对应,我们并不希望把它们全部暴露给用户。last_login_time,creation_time,create_user_id,update_time,update_user_id这些项应该被设置成在表单被提交后由程序自动附值。审查之前的表更新公共字段回顾第五,第六章,在我们介绍基于Project和Issue的CRUD功能时,我们也注意到我们的表单提供的输入项远超过了,应该暴露给用户的。当我们完成设置时,我们所有的数据库表都拥有相同的新建、更新时间和用户列,每一个自动生成的表单都有相同程度的暴露。在第五章处理创建Project时,我们完全忽略了这些输入框。同样的,在第六章建立一个新Issue时,我们只是从表单里移除了这些输入框,当一个新行被添加时,我们并没有设置任何逻辑代码来为这些框设置合适的值。让我们花费一点时间来添加这些逻辑代码。因为我们所有的实体表(tbl_project,tbl_issue,和tbl_user)都定义了相同的列,我们将添加所需的逻辑代码到一个公共基类,然后每一个独立的AR类都继承自这个公共基类可能你也想到了,在我们开始添加项目代码之前我们先要写一个测试。我们已经完成了位于tests/unit/ProjectTest.php的ProjectTest::testCreate()的测试函数,用来测试新建Project。我们将通过修改这个测试方法来测试更新公共列的操作。首先应当修改移除ProjectTest::testCreate()方法里的setAttributes()方法中,在新建Project时对这些列的直接附值:PHP代码:$newProject-setAttributes(array('name'=$newProjectName,'description'='Thisisatestfornewprojectcreation',//-remove-'createTime'='2009-09-0900:00:00',//-remove-'createUser'='1',//-remove-'updateTime'='2009-09-0900:00:00',//-remove-'updateUser'='1',));现在我们需要添加用户ID和移除当保存AR时的false参数返回,因为我们现在要触发验证。之所以要在这里触发AR验证是为了更新这些输入框,我们需要引入验证流。下面的代码显示了全部方法,同时高亮了其中修改部分。PHP代码:publicfunctiontestCreate(){//CREATEanewProject$newProject=newProject;$newProjectName='TestProjectCreation';$newProject-setAttributes(array('name'=$newProjectName,//这行'description'='Thisisatestfornewprojectcreation',//这行));//这行//settheapplicationuseridtothefirstuserinourusersfixturedataYii::app()-user-setId($this-users('user1')-id);//这行//savethenewproject,triggeringattributevalidation$this-assertTrue($newProject-save());//这行//READbackthenewlycreatedProjecttoensurethecreationworked$retrievedProject=Project::model()-findByPk($newProject-id);$this-assertTrue($retrievedProjectinstanceofProject);$this-assertEquals($newProjectName,$retrievedProject-name);//ensuretheuserassociatedwithcreatingthenewprojectisthesameastheapplicaitonuserweset//whensavingtheproject$this-assertEquals(Yii::app()-user-id,$retrievedProject-create_user_id);//这行}新添加的断言是用来测试Project表的create_user_id列是否使用了当前用户ID做更新时的属性。这已经足够证明我们的做法是可行的。如果你以命令行方式运行该命令,你将看到我们所预期的失败提示。失败的原因是我们还未为该字段设置相关逻辑代码。现在是让这个测试通过的时候了。我们着手新建一个用来存放更新相关公共字段逻辑代码的类。这个新类将成为一个可被我们应用中所有AR类继承的基类。新建这样一个基类而不是直接将相关逻辑代码添加到Project模型类的原因是:这部分逻辑代码被Issue和User模型类所共同需要。比起复制相同代码到每一个类中,上面的做法将允许我们在一个地方为每一个AR模型类同时设置那些字段(属性)。我们也将定义这个类为抽象类,这样使得他们不可以被直接实例化。我们需要在protected/models/手工新建一个文件TrackStarActiveRecord.php,并按如下形式添加代码:PHP代码:?phpabstractclassTrackStarActiveRecordextendsCActiveRecord{/***Preparescreate_time,create_user_id,update_timeand*update_user_idattributesbeforeperformingvalidation.*/protectedfunctionbeforeValidate(){if($this-isNewRecord){//setthecreatedate,lastupdateddate//andtheuserdoingthecreating$this-create_time=$this-update_time=newCDbExpression('NOW()');$this-create_user_id=$this-update_user_id=Yii::app()-user-id;}else{//notanewrecord,sojustsetthelastupdatedtime//andlastupdateduserid$this-update_time
本文标题:08_第七章:迭代4:用户管理和权限认证
链接地址:https://www.777doc.com/doc-5102546 .html