如果想要获取相关的源码,笔记,和相关工具,增加需求,代码重构,关注我并私信!!!
一 用户管理模块之用户认证
1 什么是用户认证
用户身份认证,是要解决这样的问题:
用户告诉系统“我是谁”,系统就问用户凭什么证明你就是“谁”呢?
- 对于采用用户名、密码验证的系统,那么就是出示密码。当用户名和密码匹配,则证明当前用户是谁;
- 亦或对于采用指纹等系统,则出示指纹;
- 对于硬件Key等刷卡系统,则需要刷卡。
静态密码:
用户名对应的密码设置在系统,以设置后一般不再改变,安全性低容易被木马窃取,可以定期修改密码,但不容易记忆。
动态密码:
现在最常见的短信密码就是动态密码的一种方式。每次都生成一个动态密码,安全性较高。
验证码:
注意:验证码不是用户认证的方式,只是通常在用户登录时使用验证码方式,所以,验证码的校验应该在action中实现,而不是在service层实现。
验证码是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客
对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式(比如招
商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。
2 什么是用户授权
用户授权就是给用户分配操作权限,用户认证通过后,操作指定权限的功能。
用户授权通用的数据模型:
用户表、角色表、权限表(细化到操作的链接)、用户角色关系表、角色权限关系表。
企业中在实现用户授权功能时,通常对上边的通用的数据模型进行修改。
本系统对权限表进行了扩展:除了上面的通用模型中的5张基础表,还包括了菜单表(模块表,一个菜单下包含了多个链接)、操作表(操作链接)!简单说就是对于权限表进行了分拆:分拆成了菜单表和操作表!!!
3 用户认证实现的流程分析(重点)
用户认证的步骤:(看看就好,以源码为准)
- 第1步:用户访问系统,假设该系统是可以在互联网上被公开的,通过搜索引擎可以被搜索到的,那么用户就可以点击该系统的任意一个页面中的链接进行访问的。
- 第2步(重点):系统对用户的访问进行资源的校验(链接也是一种资源),校验该用户是否通过认证(即是否登录通过):
2.1 如果用户已经认证(登录通过),放行,用户继续操作。
2.2 如果用户没有认证(登录不通过),再进行判断:如果用户访问的是否是公开资源地址(公开地址:即无需认证或登录 即可访问的页面),
如果是公开地址,系统就放行,用户继续操作;
如果访问的不是公开资源地址,进行拦截,并跳转到登陆页面(继续下面的第3步)。
- 第3步:用户进入登陆页面(这步先讲):
3.1 判断用户是否通过认证,如果认证不通过,那么进行拦截,然后跳转到登陆页面;
3.2 如果用户认证通过了,即:用户输入用户名、密码通过了认证,那么就进入系统首页!
二 用户登陆功能实现
1 验证码实现
验证码的实现是通过validatecode.jsp文件来实现的,该文件事先已经写好了,复制老师提供的validatecode.jsp(验证码jsp)文件到如下目录:
在该validatecode.jsp文件中有如下的语句:
它会将随机产生的validateCode验证码代码存入session中!!!
当然,你可以结合之前学到的知识,使用servlet来实现验证码的功能也可以!毕竟validatecode.jsp页面的定位只是一个视图的作用,不适合添加业务逻辑!
2 创建用户身份信息类ActiveUser
ActiveUser类作为用户身份信息的类,该类存储了用户身份认证(登录)通过后所需要的所有信息。
该类由老师提供,复制过来到如下目录:
源码看工程好了,注意:ActiveUser要实现序列化接口Serializable,如图:
因为ActiveUser类中还依赖另外两个类Menu和Operation,这两个类是跟授权有关的类,因为该系统不涉及授权相关的内容!所以这两个类不需要了解了!!
加进去的目的是:在认证通过后,可以把操作菜单存入session中,以便从内存中来获取!(这是授权的部分了)
3 编写Service
UserService接口的功能:校验用户身份信息.
接口参数:用户账号userid、用户密码pwd.
接口返回值:用户身份信息类ActiveUser(上面讲过)。
在UserService接口中添加方法:
因为验证码不属于身份认证的内容(上面说过了,验证码主要用来防止恶意攻击),所以UserServiceImpl中不需要去实现验证码的校验!而验证码的校验功能实现是在下面的LoginAction中来实现的.
在UserServiceImpl中checkUserInfo()方法如下:
/* * 校验用户身份信息. * userid:接收的是从LoginAction中传递过来的userid参数,即登录页面login.jsp中所输入的用户账号 * pwd:接收的是从LoginAction中传递过来的pwd参数,即登录页面login.jsp中所输入的密码 * */ @Override public ActiveUser checkUserInfo(String userid, String pwd) throws Exception { /* 第1步:校验用户是否存在. * */ Sysuser sysuser = this.findSysuserByUserid(userid); // 如果用户不存在 |