Yii 2 —— 登录用户校验

1.1  登录用户校验

在登录页面,输入用户名密码后,Yii2是如何完成用户名和密码的校验的?

1.1.1  代码流程

根据Yii的规则,用户校验的入口是从Action开始的:

SiteController->actionLogin()

LoginForm->login()

LoginForm->validate()

LoginForm->validatePassword()

User->validatePassword()

上面的代码流程把框架内的处理给隐藏起来了,从业务上来说,就是按照上述流程处理的,最终是在User->validatePassword()函数中完成密码的校验。

1.1.2  LoginForm和User

在上述代码流程中,有两个Model:

  • LoginForm

这个是登录页面的Model,按照Yii的思路,在这个Model中主要是完成输入参数的检查,譬如是否输入了用户名、密码,记住密码的数据类型是否为布尔类型等,这个Model没有跟一个实际的表关联起来。

  • User

这个是跟user表对应的Model,用来实际完成用户名和密码的校验。

以后如果想实现自己的登录操作,可对上面两个Model进行扩展,不过LoginForm没什么好扩展的,因为输入参数也还就是那么些,User倒是可以扩展,主要是使用自己的用户名、密码的校验算法。

1.1.3  Model的场景

在LoginForm中对参数进行检查,是通过Scenario来进行的,这个词被翻译为“场景”,为什么需要场景呢?

模型可能在多个场景下使用,例如 User 模块可能会在收集用户登录输入,也可能会在用户注册时使用。在不同的场景下,模型可能会使用不同的业务规则和逻辑,例如 email 属性在注册时强制要求有,但在登陆时不需要。

所以,简单的说,就是为不同的使用情况配置不同的检查范围。因此,在这一点上来说,场景跟控制器中的过滤器有类似的作用。

场景和属性校验规则的关系。

Model中可以为属性设置校验规则,然后可以设定这些属性的校验值在哪些场景下起作用。默认是在全部场景下起作用。

参考文档:

1、http://www.yiichina.com/doc/guide/2.0/structure-models

2、http://blog.csdn.net/xiaoyangxiaodong/article/details/45022019

1.1.4  Model的校验器

对输入数据的校验规则多种多样,但是每个校验规则都可能被不同的Model属性所使用,譬如要求判断某个属性必须输入等,因此现在通用的方法是为每一种规则写一个校验器,然后为Model的属性配置要使用哪一个校验器,这样就实现了校验器的复用。

在Yii中有两种校验器,一个是内置校验器,一个是Inline校验器,内置校验器就是Yii已经写好了一些常用的校验器,我们直接使用即可,而内置校验器在某些时候并不能满足需要,而且有些校验处理也并不会被复用,因此这时可以使用Inline校验器。

使用Inline校验器,只要在配置时,指定一个本Model的函数作为校验器函数,以LoginForm的密码属性为例:


public function rules()
 {
     return [
         // username and password are both required
         [[‘username‘, ‘password‘], ‘required‘],
         // rememberMe must be a boolean value
         [‘rememberMe‘, ‘boolean‘],
         // password is validated by  validatePassword()
         [‘password‘, ‘validatePassword‘],
     ];
 }
 
 public function validatePassword($attribute, $params)
 {
     if (!$this->hasErrors()) {
         $user = $this->getUser();
         if (!$user || !$user->validatePassword($this->password)) {
             $this->addError($attribute, ‘Incorrect username or password.‘);
         }
     }
 }

在rules()函数里配置了password的校验器为validatePassword,但是内置校验器中是没有这个的,于是在Model->load()函数中,载入属性数据并为属性创建校验器时,检查到本Model具有validatePassword接口,则就为password属性创建一个Inline校验器,执行本Model的validatePassword接口完成校验。

时间: 2024-08-08 12:43:19

Yii 2 —— 登录用户校验的相关文章

UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个文件访问权限.虽然说进程的有效用户 ID 和有效组 ID 通常分别等于当前登录用户 ID 和用户所在组 ID.例如,一个进程可能因设置用户 ID 以另一个用户权限运行,它仍可能想验证当前实际登录的用户是否能否访问一个给定的文件. access 函数提供了按照实际用户 ID 和实际组 ID 进行访问权

yii自动登录

在yii,登录页面选择记住密码,下次就会自动登陆 前些天,自己增加了一个web应用,但是发现虽然选择记住密码,没选退出,关闭浏览器,重新进入还会跳转到登陆页面 自动登录是利用cookie实现的 配置User组件 首先在配置文件的components中设置user组件 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, 'idParam' => '__check', 'identit

crm 系统项目(一) 登录,注册,校验

crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db import models from multiselectfield import MultiSelectField course_choices = (('Linux', 'Linux中高级'), ('PythonFullStack', 'Python高级全栈开发'),) class_type_choi

Linux下用于查看系统当前登录用户信息的4种方法

作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动.有些时候,你甚至需要知道他(她)们正在做什么.本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法. 1. 使用w命令查看登录用户正在使用的进程信息 w命令用于显示已经登录系统的用户的名称,以及他们正在做的事.该命令所使用的信息来源于/var/run/utmp文件.w命令输出的信息包括:?用户名称 ?用户的机器名称或tty号 ?远程主机地址 ?用户登录系统的时间 ?空闲时间(作用不大) ?附加到tty(终端)的

Linux系统下如何查看已经登录用户

Linux系统下如何查看已经登录用户 虽然前面介绍了用户管理,但是那部分主要是管理用户的帐号,也就静态的用户列表.而LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务.系统管理员可以随时了解系统中有那些用户,用户都在进行什么操作. 查看用户的操作 系统管理员若想知道某一时刻用户的行为,只需要输入命令W 即可,在SHELL终端中输入如下命令: [[email protected] ROOT] # W2:31PM UP 11 DAY ,21:18 4 USERS, LODE

Linux下查看/管理当前登录用户及用户操作历史记录

一.查看及管理当前登录用户 1.使用w命令查看登录用户正在使用的进程信息,w命令用于显示已经登录系统的用户的名称,以及他们正在做的事.该命令所使用的信息来源于/var/run/utmp文件.w命令输出的信息包括: 用户名称 用户的机器名称或tty号 远程主机地址 用户登录系统的时间 空闲时间(作用不大) 附加到tty(终端)的进程所用的时间(JCPU时间) 当前进程所用时间(PCPU时间) 用户当前正在使用的命令 $ w 23:04:27 up 29 days, 7:51, 3 users, l

SQL Server 2008等登录用户只能看到自己的数据库设置办法

默认情况下登录用户除了看到自己拥有管理权限的数据库外.还可以看到其他数据库,在点击打开时会提示没有权限.如下设置可使该用户只能看到自己拥有管理权限的数据库,而看不到其他没有权限的数据库. (1)取消默认可查看任何数据库 DENY VIEW any DATABASE TO PUBLIC;  -- 没有进行权限设置,所有默认的登录用户不能查看任何数据库 (2)赋予自己拥有管理权限的数据库的查看权限 ALTER AUTHORIZATION ON DATABASE::DBName TO DBUser;

arm linux设置登录用户和用户密码,以及登录到root后reboot无法重启的问题

设置登录用户和用户密码 在/etc/inittab文件中,内容如下 #first:run the system script file ::sysinit:/etc/init.d/rcS #::askfirst:-/bin/sh ::sysinit:-/bin/login ::ctrlaltdel:-/sbin/reboot #umount all filesystem ::shutdown:/bin/umount -a -r #restart init process ::restart:/s

在SQL Server 2008 中使用SQL脚本创建登录用户并授权

到处都使用超级用户sa显然是不安全的,因此有创建用户并让其只能访问某个数据库的必要.当然可以使用SQL Server自带的图形界面向导,但是太难用用了!有时候代码比较直接,比如这里: --使用已经创建好的数据库 use mydb GO --创建登录用户和密码 EXEC sp_addlogin N'mydb_user','123456' --使mydb_user成为当前数据库的合法用户 EXEC sp_grantdbaccess N'mydb_user' --授予mydb_user对自己数据库的所