用了一阵子yii框架,也做了几个yii得项目,但是觉得还是有很多yii神奇得地方还没有用到,于是,准备抽时间把yii框架得一些自带得demo分析一下,顺便在仔细得阅读一下官方手册,把一些能自己能用得到的或者觉得有用的东西记下来,顺便也是对自己最近有些放松的惩罚把。看看这个系列的文章能写出来几篇把(PS:此时我的内心毫无波澜,甚至想哭)

前戏就不多做了。。反正,就是下载框架文件(我下载的是高级版),配置vhost文件(我用的使windows环境,apache服务器)等操作。

demo中,做了用户访问的验证,在未登录的情况下,访问任何地址都会跳转到登录页面(404除外,因为404做了错误处理)

其实就是一个很简单的用户信息验证,如果按照之前我的写法是继承一个公共的控制器,在公共控制器中进行用户的验证,session和cookie的取值等操作;如果使用yii中的文件只需要简单修改配置文件也能完成同样的操作,因为框架内部本身就存在了一套用户验证的流程,只需要在配置文件中配置好相关的参数就可以。

咦,但是这样不就不能自定义自己的用户类或者跳转页面了吗?yii怎么能如此低端呢,其实这里面的大部分都可以通过配置参数来解决,包括用户的model模型类、是否开启自动登录(当cookie中存在信息时)、验证的规则(包括允许访问和控制器、动作、自定义规则函数),甚至用户信息保存的cookie名称都可以通过配置来改变,不得不说,真是考虑的太完善了~~~~

好了,废话太多了,我自己都不知道该说什么了。下面开始分析一下yii验证用户信息的流程吧:

demo中只有一个site控制器,这也是yii一些操作和核心类中默认的控制器,控制器中也没有相关的检测方法,而且里面的action也非常简答,无非就是直接渲染视图或者表单提交一类的东西,那么验证的地方到底在哪里呢?其实,就在这个位置

behaviors,在yii中这类操作叫做行为,可以自己定义行为触发的时机,访问action之前或者之后等(默认是访问之前),从代码中可以看出,behaviors中定义了两个行为,access和verbs,从名字中可以看出来一个是访问,一个是动作

这次主要讨论的就是access中的规则,verbs中的规则相对简单,是验证对应访问的请求方式,这里是如果想访问logout,只有通过post请求才可以成功,access中class指定了这个行为是由那个类来完成的,下面的函数对应的是AccessControl类中的属性,可以看到rules中存在两条验证,第一条是login、error两个actio可以直接访问,第二条是logout和index需要验证之后才可以访问。

当用户访问时,首先会进行behaviors中的操作,先到AccessControl中进行验证,然而在AccessControl中,存在$user,$denyCallback,$ruleConfig,$rules四个属性,分别是用户操作类,拒绝访问时的自定义回调函数,默认的规则配置(默认指向yii中的验证类),验证规则(刚才在behaviors中定义的rules)

AccessControl先将user中的用户类赋值给当前属性(如果不存在或者路径错误将会抛出错误,因为后续很多操作都与此类由关),同时将自定义rules中的内容和$ruleConfig默认类中的类型进行合并(自定义rules内容会直接覆盖,以自定义中内容优先)

随后执行beforeAction中的内容,首先循环对规则中的内容进行验证,调用AccessRule(ruleConfig属性中默认的验证类)类中的allow函数,当验证结果为ture时,将跳出behaviors操作,继续访问地址中的内容;如果结果为false或null将会向下执行,调用自定义函数或执行本身的denyAccess函数

在AccessRule->allow的验证方法中,存在对地址的很多种验证,如matchRole(角色权限)、matchIP(IP)、matchController(控制器)、matchVerb(请求方式)等

本例中,直接访问index的情况下,不在允许访问的范围内,而且也没有登录,在matchRole验证时就会直接返回false,而在AccessControl中也会直接向下执行denyAccess方法

denyAccess方法中,会验证当前用户是否是访客(未登录),如果未登录,则会通过user类中的loginRequired函数重定向到登录页面,而在user类中默认的登录页面就是site/login!所以每次直接访问的时候都会直接跳转到site/login这个页面中

user类中的属性都可以通过配置文件中的内容来进行覆盖,达到灵活操纵的目的

PS:在验证用户是否为访客时,如果cookie中存在用户信息,在自动刷新时候会用到用户类中的一些函数,而用户类是用户在配置文件中指定的自定义类,所以在定义类的时候要有几个函数是必须存在的,但是我怎么知道核心类中的函数有哪些?不要方,只需要继承IdentityInterface接口就好了!这个接口就是专门为此来准备的!

整个访问验证流程就这事这样的了,其实最主要的流程yii都已经完成了,用户可需要根据配置文件配置必要的信息,就可以直接实现这一功能了!