一步一个脚印,踏踏实实的做事情,切忌心浮气躁,眼高手低。
今天我们做的是权限控制模块,这个模块在项目中不可或缺的,几乎所有的系统中都需要做权限。
首先解决上次课遗留的两个问题:
1 用户管理中的用户密码使用明文密码的MD5摘要
使用Apache的codec包中的DigestUtils.md5Hex()方法将密码转换为MD5的形式
2 登录名的唯一性验证
使用Ajax技术进行验证,在用户注册的表单登录名的<html:text>的styleclass属性中添加required指定为必选项和remote属性指定验证登陆名的方法的路径。 remote是远程验证,返回值只能是true(验证成功)或false(验证失败)。
remote使用时遇到的问题:添加用户时需要验证用户名是否存在,当添加上一个用户后,在不离开该页面的情况下,再次添加该用户名的用户,validate不能提示该用户已存在,因为缓存的原因,jquery仍认为该用户名可用。解决方法是在页面中添加:
$().ready(function(){
$.ajaxSetup ({
cache: false //关闭AJAX相应的缓存
}); // 关闭缓存功能
});
权限可简单表述为这样的逻辑表达式:判断“Who对What(Which)进行How的操作”的逻辑表达式是否为真。用户有什么权限,也就是有多少“资源+操作”的许可,存在着两种权限管理:其一是功能权限的管理(粗粒度),另外一种则是数据权限的管理(细粒度)
项目中可能存在的权限需求的分类
1, 系统权限,主要是以模块为单位的权限划分,用户对该模块可见不可见。
2, 对象实例级权限,具体说就是对每条数据都要实现权限控制。
3, 数据字段权限,每条业务数据权限可以精确控制到每一个字段。
我们要做的菜单和菜单内的按钮的权限管理属于第二种,使用URL列表进行控制。让每一个用户都有一个可以访问的url列表代表用户的权限。使用角色进行权限分配,跟数据库中的角色类似,这样管理者就不必再进行对其下员工逐一分配操作权限的繁琐操作了了。
权限系统的构成部分
创建权限 首先将系统中有哪些权限做好
分配权限 为用户设定指定的权限
使用权限 用户可以去访问系统的各个功能时,系统进行权限验证判断是否具有访问权限
我们完成的功能:
1 初始化数据
添加一个系统管理员用户为其他的用户设定权限
添加资源数据
2 岗位管理分配权限
在分配权限的页面还使用jQuery的TreeView插件显示树形结构,这个插件使用起来非常简单,只要将JS文件导入,然后加载时用“$(UL标签的id).treeview()即可显示树形结构了,关键是如何对应格式的权限列表,这里又用到了递归,最后使用jQuery实现一些细节操作。
3 用户登陆注销
只有用户登陆后才能进行相应操作
4 根据用户权限决定菜单按钮显示
使用自定义标签的方式,在页面相应的超链接外面嵌套自定义标签,在自定义标签中定义name属性表明可以显示这个超链接,当用户登录时判断用户的权限列表内是否有该权限,有则显示,没有则不显示。
5 权限验证,拦截所有的访问请求(*.jsp与*.do),有权限才可以访问。没有权限时转到登录页面或没有权限页面。
使用过滤器
过滤器的dofilter()方法中的逻辑代码:
doFilter(){
User currentUser = 当前登录用户;
String url = 当前访问的URL;
// 格式为 /xx.do?method=xx,且method=addUI与method=add是同一个权限
if ("/InitDataAction.do".equals(url)) { // 初始化数据的操作
chain.doFilter(request, response);
}else if (currentUser == null) { // 未登录用户
if(如果请求的是登录){
chain.doFilter();
}else{
转到登录页面
}
}else{ // 已登录
if(是超级管理员){
chain.doFilter();
}else{
if(不需要权限){
chain.doFilter();
}
else{
boolean 有权限 = currentUser.allResources.contains(url);
if(有权限){
chain.doFilter();
}else{
转到没有权限的提示页面
}
}