记得大二暑假时曾经参加过一个OA系统的开发,在安全方面系统采取对拥有不同操作权限的用户进行分组,也就是权限组或者叫用户组,管理员可以控制用户该做什么,不该做什么,但当时我只是负责其中的考勤系统设计,对这个并没有太多关注。
不过最近想了想,决定进行一点简单的设计。
从关系上看:
l 每个权限组可以包含多个操作,每个操作可以被多个权限组包含,即多对多关系
l 每个权限组可以包含多个用户,每个用户可以属于多个权限组,也是多对多关系
l 操作可以有父操作和子操作(这些不多说)
表与表之间的关系描述如下:
权限组N--1 中间表(权限组—操作)1--N 操作
权限组N--1 中间表(权限组—用户)1--N 用户
字段名字 |
字段介绍 |
类型 |
外键 |
|
操作表 operate |
||||
Id |
主键 |
Int |
无 |
|
Operate_name |
操作名字 |
Char(255) |
无 |
|
Operate_link |
操作链接 |
Char(255) |
无 |
|
operate_userGroup_id |
对应中间表id |
Int |
外键(中间表(权限组—操作)) |
|
权限组 userGroup |
||||
Id |
主键 |
Int |
无 |
|
userGroup _name |
权限组名字 |
Var(255) |
无 |
|
userGroup_operate_id |
对应中间表id |
Int |
外键(中间表(权限组—操作)) |
|
userGroup _user_id |
对应中间表id |
Int |
外键(中间表(权限组—用户)) |
|
用户 user |
||||
Id |
主键 |
Int |
无 |
|
user_name |
用户名 |
Char(255) |
无 |
|
password |
密码 |
Char(255) |
无 |
|
user _ userGroup _id |
对应中间表id |
Int |
外键(中间表(权限组—用户)) |
|
中间表(权限组—操作) userGroup _operate |
||||
Id |
主键 |
Int |
无 |
|
userGroup _id |
权限组ID |
Int |
无 |
|
operate_id |
操作ID |
Int |
无 |
|
中间表(权限组—用户) userGroup _user |
||||
Id |
主键 |
Int |
无 |
|
userGroup _id |
权限组ID |
Int |
无 |
|
user_id |
用户ID |
Int |
无 |
|
添加一个超级管理员 (admin,admin),具备所有操作权限
l 管理员登录,C操作
l 创建权限组,C操作
l 创建操作,C操作
l 创建用户,C操作
l 向权限组添加操作,C操作
l 为操作分配权限组,C操作
l 向权限组添加用户,C操作
l 为用户分配权限组,C操作
l 当用户进行一个操作时,会向目的地发出对应于该操作的编号ID,目的地接受到这个ID后,首先判断该操作是否在表中存在,若存在就检查该用户所在权限组是否包含此操作,包含则执行此操作
l 此外,对操作,权限组,用户以及用户之间的关系也需要进行动态的管理,例如CRUD
测试
用户登录
执行某项操作
根据权限看是否执行成功
用户权限验证流程
在J2EE结构中,通常我们可以在控制器如Servlet或者Action来对所有用户的权限进行统一的校验(当然过滤器也是个不错的选择),来对用户操作进行统一的处理,比如说在一个Jsp+Servlet+JavaBean的B/S系统中,通常我们是由Servlet作为控制器的,那么我们就可以设计一个BaseServlet,
对里面的doPost(HttpServletRequest request,HttpServletResponse response)这样设计
/**
* 这个doPost方法现在对权限进行校验
*/
Public void doPost(HttpServletRequest request,HttpServletResponse response){
//获取操作ID
Int operateId =new ParseRequest().parseInt(request,”operateId”,0);
//判断该操作是否存在数据库中
If(new OperateService().isExist(operateId)){
//如果该操作存在于数据库中的话
//获取用户ID
Int userId=(UserInfo)request.getSession().get(“USERINFO”).getId();
//判断该用户是否具备进行该操作得权限
If(new UserService().is Valid(userId,operateId)){
//该用户可以进行此项操作
//转向执行方法
Execute(request,response);
}else{
//发生错误,用户无权限进行此操作
}
}else{
//发生错误,该操作不存在
}
}
/**
* 这个方法将被该类地子类实现,用来接收参数,调用Bean来完成一些操作
*/
Public void execute(HttpServletRequest request,HttpServletResponse response){
}
现在我们再开发Servlet的时候,只需要继承这个BaseServlet,然后复写Public void execute(HttpServletRequest request,HttpServletResponse response)方法,这样就可以对权限操作进行有效的控制了,当然,笔者这里建议最好你要跳转到的jsp页也采用Servlet进行转发。