概述:

在系统开发过程中需要考虑的一个重要的问题就是权限问题,权限问题也是安全问题的一个范畴,我们要求在用户登录系统之后,要控制用户可以访问的系统资源,使得用户只可以访问到系统事先分配好的资源;这里的资源可以是一个URL地址,也可以是页面上的菜单和按钮等。对于实现权限的控制有多种方案,这里说明一下通过URL拦截的方式进行权限控制的实现方案。

基本流程:

对于权限的控制可以分为两个步骤:认证和授权。

认证:即用户登录系统的时候对用户的身份信息进行判别。

授权:即在用户登录成功后为用户分配用户可以访问的资源。

流程图:根据用户的认证和授权过程抽象出如下流程图

通用模型:

根据我们对权限控制的要求,我们可以抽取出如下数据模型:

主体:用户,程序等,包括账号和密码等属性

资源:URL,菜单,按钮等

角色:为了方便资源和主体之间的关系管理,我们一般会在它们之间抽取出一个角色实体,一个角色就是一类主体,通过角色可以实现对主体的分组管理,这样可以更加方便的对主体和其所对应的资源进行管理(扩张和修改)。

模型结构如下图所示:

实现过程:

1、定义用户身份和基本操作:

这里我们创建一个用户的身份实体ActiveUser,用来存放用户的身份信息,在用户登录成功后将该身份信息存放到session当中,

  1. //用户登陆请求
  2. @RequestMapping("/loginsubmit")
  3. public String loginsubmit(HttpSession session,String usercode,String password,String randomcode) throws Exception{
  4. //校验验证码
  5. //从session获取正确验证码
  6. String validateCode = (String)session.getAttribute("validateCode");
  7. if(!randomcode.equals(validateCode)){
  8. //抛出异常:验证码错误
  9. throw new CustomException("验证码 错误 !");
  10. }
  11. //用户身份认证
  12. ActiveUser activeUser = sysService.authenticat(usercode, password);
  13. //登录成功将用户信息记录到session
  14. session.setAttribute("activeUser", activeUser);
  15. //跳转到首页
  16. return "redirect:first.action";
  17. }
  18. //退出请求
  19. @RequestMapping("/logout")
  20. public String logout(HttpSession httpSession) throws Exception{
  21. //清空session
  22. httpSession.invalidate();
  23. return "redirect:first.action";
  24. }

2、公开访问地址配置:

对于不需要用户认证就可以访问的地址信息进行配置,这里我们可以单独写一个配置文件进行配置,后边读取判断。

  1. #公开访问地址
  2. login.action=登录页面
  3. loginsubmit.action=登录请求

3、公共访问地址配置:

对于只要用户认证通过就可以访问的地址信息进行配置,这里我们同样也是通过一个配置文件进行配置,后边通过读取判断。

  1. #公共访问地址
  2. first.action=首页
  3. logout.action=退出

4、认证拦截器:

通过认证拦截器对用户身份信息进行判断。

  1. public class LoginInterceptor implements HandlerInterceptor {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request,
  4. HttpServletResponse response, Object handler) throws Exception {
  5. // 校验是否是公开资源地址
  6. List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");
  7. // 用户访问的url
  8. String url = request.getRequestURI();
  9. for (String open_url : open_urls) {
  10. if (url.indexOf(open_url) >= 0) {
  11. // 如果访问的是公开 地址则放行
  12. return true;
  13. }
  14. }
  15. // 用户是否登录成功
  16. HttpSession session = request.getSession();
  17. ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
  18. if (activeUser != null) {
  19. // 用户已经登陆认证,放行
  20. return true;
  21. }
  22. // 否则跳转到登陆页面
  23. request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,
  24. response);
  25. return false;
  26. }
  27. @Override
  28. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
  29. Object arg2, ModelAndView arg3) throws Exception {
  30. }
  31. @Override
  32. public void afterCompletion(HttpServletRequest arg0,
  33. HttpServletResponse arg1, Object arg2, Exception arg3)
  34. throws Exception {
  35. }
  36. }

5、授权拦截器

通过授权拦截器,判断用户是否具有访问资源的权限。

  1. public class PermissionInterceptor implements HandlerInterceptor {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request,
  4. HttpServletResponse response, Object handler) throws Exception {
  5. String url = request.getRequestURI();
  6. // 校验是否是公开资源地址
  7. List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");
  8. for (String open_url : open_urls) {
  9. if (url.indexOf(open_url) >= 0) {
  10. // 公开地址放行
  11. return true;
  12. }
  13. }
  14. //判断是否是公共访问地址
  15. List<String> common_urls = ResourcesUtil.gekeyList("commonURL");
  16. for (String common_url : common_urls) {
  17. if (url.indexOf(common_url) >= 0) {
  18. //公共地址放行
  19. return true;
  20. }
  21. }
  22. HttpSession session = request.getSession();
  23. ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
  24. // 获取用户权限列表
  25. List<SysPermission> permission_list = activeUser.getPermissions();
  26. // 校验用户访问地址是否在用户权限范围内
  27. for (SysPermission sysPermission : permission_list) {
  28. String permission_url = sysPermission.getUrl();
  29. if (url.contains(permission_url)) {
  30. return true;
  31. }
  32. }
  33. // 跳转到拒绝访问的页面
  34. request.getRequestDispatcher("/refuse.jsp").forward(
  35. request, response);
  36. return false;
  37. }
  38. @Override
  39. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
  40. Object arg2, ModelAndView arg3) throws Exception {
  41. }
  42. @Override
  43. public void afterCompletion(HttpServletRequest arg0,
  44. HttpServletResponse arg1, Object arg2, Exception arg3)
  45. throws Exception {
  46. }
  47. }

6、配置拦截器

将拦截器配置起来,使其工作。

  1. <!-- 拦截器 -->
  2. <mvc:interceptors>
  3. <!-- 多个拦截器,顺序执行 -->
  4. <!-- 认证拦截器 -->
  5. <mvc:interceptor>
  6. <mvc:mapping path="/**" />
  7. <bean class="cn.itcast.ssm.controller.interceptor.LoginInterceptor"></bean>
  8. </mvc:interceptor>
  9. <!-- 授权拦截器 -->
  10. <mvc:interceptor>
  11. <mvc:mapping path="/**" />
  12. <bean class="cn.itcast.ssm.controller.interceptor.PermissionInterceptor"></bean>
  13. </mvc:interceptor>
  14. </mvc:interceptors>

总结

这里主要是通过两个拦截器实现了认证和授权,其优点是可以不必依赖于框架实现,对于拦截器我们也可以通过web提供的filter实现;缺点在于对于系统配置很多的URL,或者在系统初始化时将URL设置到数据库中,再有就是对于访问地址的变动要同时改变配置,维护相对不易。

权限控制方案之——基于URL拦截的更多相关文章

  1. 基于url拦截实现权限控制

    用户表,角色表,用户角色表,权限表,权限角色表 1.用户通过认证(可以是验证用户名,密码等) 2.登陆拦截器,为公开的url放行, 登陆时,将用户信息放入session中,获得用户的权限集合,将集合放 ...

  2. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  3. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  4. python RBAC权限控制模型扩展 基于JWT实现

    jwt,全称 json web token,是使用一定的加密规则生成的token串来保证登录状态.验证用户身份.做权限认证等工作 以往保存用户登录状态多用session实现,但是当服务涉及多台服务器分 ...

  5. PHP中多IP段权限控制方案

    在某些项目中我们可能会用到根据IP段进行权限校验,比如不在我们配置的IP段内的用户访问某些页面或功能模块时,将提示其权限不够并禁止访问该页面的内容.鉴于项目中需求各异,下面只说下大致思路以及我个人的实 ...

  6. 基于url拦截

  7. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  8. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  9. 基于URL权限拦截的实现

    一.实现原理 1.实现原理   本示例采用SpringMVC的拦截器来实现一个基于URL的权限拦截. 2.权限管理流程 二.数据库搭建 1.用户表(sys_user) (1)表结构 (2)表字段说明 ...

随机推荐

  1. 《机器学习实战》---第二章 k近邻算法 kNN

    下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...

  2. Java 接口中定义抽象方法有什么意义

    接口方法声明只能是public abstract的,所以不管你在声明的时候加不加abstract,都是可以的.Java 8开始,接口还引入了默认方法,也就是可以给接口的方法提供默认的实现,默认方法应当 ...

  3. 【ALearning】第四章 Android Layout组件布局(二)

    前面我们分别介绍和学习了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoluteLayout(绝对布局).这次我们要进行RelativeLayout(相对布局)和Ta ...

  4. 数据结构与算法实验题 9.1 K 歌 DFS+剪枝

    数据结构与算法实验题 K 歌 ★实验任务 3* n 个人(标号1~ 3 * n )分成 n 组 K 歌.有 m 个 3 人组合,每个组合都对应一个分数,你能算出最大能够得到的总分数么? ★数据输入 输 ...

  5. 12.1、USB驱动——描述符、URB、管道

    大家常说,一个设备通常有多个配置,配置通常有多个接口,接口通常有多个端点.接口代表逻辑上的设备,比如声卡分为 录音和播放.访问设备时,访问的是某个接口(逻辑设备).除了端点0之外,每个端点只支持一个传 ...

  6. ZOJ 3204 Connect them 继续MST

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 题目大意: 让你求最小生成树,并且按照字典序输出哪些点连接.无解输出-1 ...

  7. 【t035】收入计划

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱.从今天起,Matrix67将连续工作N天( ...

  8. Django之文章归档

    1.任务描述:将博文按照时间月份归档 2.源代码: views.py def getPage(request, article_list): paginator = Paginator(article ...

  9. Spark源代码阅读笔记之DiskStore

    Spark源代码阅读笔记之DiskStore BlockManager底层通过BlockStore来对数据进行实际的存储.BlockStore是一个抽象类,有三种实现:DiskStore(磁盘级别的持 ...

  10. 【????】最短路(short)

    问题描述: 给出N个点,M条无向边的简单图,问所有点对之间的最短路. 数据输入: 第1行两个正整数N,M(N<=100,M<=5000) 下面M行,每行3个正整数x, y, w,为一条连接 ...