概述:

在系统开发过程中需要考虑的一个重要的问题就是权限问题,权限问题也是安全问题的一个范畴,我们要求在用户登录系统之后,要控制用户可以访问的系统资源,使得用户只可以访问到系统事先分配好的资源;这里的资源可以是一个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. Linux下开启关闭防火墙

    一.Linux下开启/关闭防火墙命令 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off   2) 即时生效,重 ...

  2. (转)curl 命令使用

    原文地址:http://blog.sina.com.cn/s/blog_4b9eab320100slyw.html 可以看作命令行浏览器 1.开启gzip请求curl -I http://www.si ...

  3. 修改SVN中文件的可执行属性

    博文来自下面路径,转载请注明原出处: http://bigwhite.blogbus.com/logs/74568031.html 修改SVN中文件的可执行属性 - [开源世界] Tag:开源世界 S ...

  4. Win或Linux中编译安装软件的命令解析: configure; make; make install

    原文地址:http://www.cnblogs.com/Jerry-Chou/archive/2010/12/18/1909843.html 翻译一篇文章,我最早从这篇文章中了解到为什么Linux平台 ...

  5. ZOJ 3204 Connect them 继续MST

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

  6. QAtomicInt支持四种类型的操作,Relaxed、Acquired、Release、Ordered

    Memory Ordering   Background 很久很久很久以前,CPU忠厚老实,一条一条指令的执行我们给它的程序,规规矩矩的进行计算和内存的存取. 很久很久以前, CPU学会了Out-Of ...

  7. Android自定义组件系列【6】——进阶实践(3)

    上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划 ...

  8. [RxJS] Split an RxJS Observable into groups with groupBy

    groupBy() is another RxJS operator to create higher order observables. In this lesson we will learn ...

  9. Cisco IOS images

    Cisco IOS images for Dynamips - GNS3http://docs.gns3.com/1-kBrTplBltp9P3P-AigoMzlDO-ISyL1h3bYpOl5Q8m ...

  10. 记录一次mysql由5.6升级到5.7出现的异常---Expression #23 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'c.commentCount' which is not functionally dependent on columns in GROUP BY clause;

    ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expre ...