B/S系统权限组设计方案

记得大二暑假时曾经参加过一个OA系统的开发,在安全方面系统采取对拥有不同操作权限的用户进行分组,也就是权限组或者叫用户组,管理员可以控制用户该做什么,不该做什么,但当时我只是负责其中的考勤系统设计,对这个并没有太多关注。

不过最近想了想,决定进行一点简单的设计。

从关系上看:

l  每个权限组可以包含多个操作,每个操作可以被多个权限组包含,即多对多关系

l  每个权限组可以包含多个用户,每个用户可以属于多个权限组,也是多对多关系

l  操作可以有父操作和子操作(这些不多说)

表与表之间的关系描述如下:

权限组N--1 中间表(权限组操作)1--N 操作

权限组N--1 中间表(权限组用户)1--N 用户

字段名字

字段介绍

类型

外键

 

操作表    operate

Id

主键

Int

 

Operate_name

操作名字

Char255

 

Operate_link

操作链接

Char255

 

operate_userGroup_id 

对应中间表id

Int

外键(中间表(权限组操作))

 

权限组   userGroup

Id

主键

Int

 

userGroup _name

 权限组名字

Var255

 

userGroup_operate_id

对应中间表id

Int

外键(中间表(权限组操作))

 

userGroup _user_id

对应中间表id

Int

外键(中间表(权限组用户))

 

用户   user

Id

主键

Int

 

user_name

用户名

Char255

 

password

密码

Char255

 

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

 

添加一个超级管理员 (adminadmin),具备所有操作权限

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+JavaBeanB/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进行转发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
针对 OA 系统的特点,权限说明: 权限系统中,权限通过模块 +动作来产生,模块就是整个系统中的一个子模块,可能对应一个 菜单,动作也就是整个模块中(在B/S 系统中也就是一个页面的所有操作,比如“ 浏览、添 加、修改、删除” 等)。将模块与之合可以产生此模块下的所有权限权限 为了更方便的权限的管理,另将一个模块下的所有权限合一起,成一个“ 权限” ,也就 是一个模块管理权限,包括所有基本权限操作。比如一个权限(用户管理),包括用户的 浏览、添加、删除、修改、审核等操作权限,一个权限也是一个权限。 角色 权限的集合,角色与角色之间属于平级关系,可以将基本权限权限添加到一个角色中, 用于方便权限的分配。 用户 将某一类型的人、具有相同特征人合一起的集合体。通过对授予权限(角色),快速使 一类人具有相同的权限,来简化对用户授予权限的繁琐性、耗时性。用户的划分,可以按 职位、项目或其它来实现。用户可以属于某一个或多个。 通过给某个人赋予权限,有4 种方式( 参考飞思办公系统) A . 通过职位 a) 在职位中,职位成员的权限继承当前所在职位的权限,对于下级职位拥有的权限不可继 承。 b) 实例中:如前台这个职位,对于考勤查询有权限,则可以通过对前台这个职位设置考勤 查询的浏览权,使他们有使用这个对象的权限,然后再设置个,考勤查询权(当然也可以不 设置,默认能进此模块的就能查询),则所有前台人员都拥有考勤查询的权利。 B. 通过项目 a) 在项目中,项目成员的权限来自于所在项目的权限,他们同样不能继承下级项目的权限, 而对于项目长,他对项目有全权,对下级项目也一样。 b) 实例中:在项目中,项目成员可以对项目中上传文档,查看本项目的文档,可以通过对项 目设置一个对于本项目的浏览权来实现进口,这样每个成员能访问这个项目了,再加上项目 文档的上传权和查看文档权即可。 c) 对于长,因为可以赋予长一个长权(长权是个特殊的权限,它包含其他各种权 限的一个权限包),所有长对于本项目有全权,则项目长可以对于项目文档查看,审批, 删除,恢复等,这些权限对于本项目的下级项目依然有效。 C. 通过角色 a) 角色中的成员继承角色的权限,角色与角色没有上下级关系,他们是平行的。通过角色 赋予权限,是指没办法按职位或项目的分类来赋予权限的另一种方式,如:系统管理员,资 料备份员… b) 实例中:对于本系统中,全体人员应该默认都有的模块,如我的邮件,我的文档,我的 日志,我的考勤……,这些模块系统成员都应该有的,我们建立一个角色为系统默认角色, 把所有默认访问的模块的浏览权加入到里面去,则系统成员都能访问这些模块。 D. 直接指定 a) 直接指定是通过对某个人具体指定一项权限,使其有使用这个权限的能力。直接指定是 角色指定的一个简化版,为了是在建立像某个项目的长这种角色时,省略创建角色这一个 步骤,使角色不至于过多。 b) 实例中:指定某个项目的长,把长权指定给某个人。 针对职位、项目: 如果用添加新员工,员工调换职位、项目,满足了员工会自动继承所在职位、项目的权 限,不需要重新分配权限的功能。 用户管理 用户可以属于某一个或多个用户,可以通过对用户授权,来对中的所有用户进行权限 的授予。一个用户可以属于多个项目,或担任多个职位。 授权管理 将一个基本权限或角色授予用户或用户,使用户或用户拥有授予权限的字符串,如果角 色、职位、项目中存在相同的基本权限,则取其中的一 个;如脱离角色、职位、项目, 只是取消用户或用户的中此角色、职位、项目所授予的权限。用户所拥有的权限是所有 途径授予权限的集合。管理员用户可以 查看每个用户的最终权限列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值