权限控制方案之——基于URL拦截

概述:

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

基本流程:

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

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

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

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

通用模型:

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

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

资源:URL,菜单,按钮等

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

模型结构如下图所示:

实现过程:

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

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

	//用户登陆请求
	@RequestMapping("/loginsubmit")
	public String loginsubmit(HttpSession session,String usercode,String password,String randomcode) throws Exception{

		//校验验证码
		//从session获取正确验证码
		String validateCode = (String)session.getAttribute("validateCode");
		if(!randomcode.equals(validateCode)){
			//抛出异常:验证码错误
			throw new CustomException("验证码 错误 !");
		}
		//用户身份认证
		ActiveUser activeUser = sysService.authenticat(usercode, password);

		//登录成功将用户信息记录到session
		session.setAttribute("activeUser", activeUser);
		//跳转到首页
		return "redirect:first.action";
	}
	//退出请求
	@RequestMapping("/logout")
	public String logout(HttpSession httpSession) throws Exception{
		//清空session
		httpSession.invalidate();
		return "redirect:first.action";
	}

2、公开访问地址配置:

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

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

3、公共访问地址配置:

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

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

4、认证拦截器:

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

public class LoginInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {

		// 校验是否是公开资源地址
		List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");

		// 用户访问的url
		String url = request.getRequestURI();
		for (String open_url : open_urls) {
			if (url.indexOf(open_url) >= 0) {
				// 如果访问的是公开 地址则放行
				return true;
			}
		}

		// 用户是否登录成功
		HttpSession session = request.getSession();
		ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
		if (activeUser != null) {
			// 用户已经登陆认证,放行
			return true;
		}
		// 否则跳转到登陆页面
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,
				response);
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
	}
}

5、授权拦截器

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

public class PermissionInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {

		String url = request.getRequestURI();

		// 校验是否是公开资源地址
		List<String> open_urls = ResourcesUtil.gekeyList("anonymousURL");

		for (String open_url : open_urls) {
			if (url.indexOf(open_url) >= 0) {
				// 公开地址放行
				return true;
			}
		}
		//判断是否是公共访问地址
		List<String> common_urls = ResourcesUtil.gekeyList("commonURL");

		for (String common_url : common_urls) {
			if (url.indexOf(common_url) >= 0) {
				//公共地址放行
				return true;
			}
		}

		HttpSession session = request.getSession();
		ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
		// 获取用户权限列表
		List<SysPermission> permission_list = activeUser.getPermissions();
		// 校验用户访问地址是否在用户权限范围内
		for (SysPermission sysPermission : permission_list) {
			String permission_url = sysPermission.getUrl();
			if (url.contains(permission_url)) {
				return true;
			}
		}
		// 跳转到拒绝访问的页面
		request.getRequestDispatcher("/refuse.jsp").forward(
				request, response);
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {

	}

	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
	}
}

6、配置拦截器

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

	<!-- 拦截器 -->
	<mvc:interceptors>
		<!-- 多个拦截器,顺序执行 -->
		<!-- 认证拦截器 -->
		<mvc:interceptor>
			<mvc:mapping path="/**" />
			<bean class="cn.itcast.ssm.controller.interceptor.LoginInterceptor"></bean>
		</mvc:interceptor>
		<!-- 授权拦截器 -->
		<mvc:interceptor>
			<mvc:mapping path="/**" />
			<bean class="cn.itcast.ssm.controller.interceptor.PermissionInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

总结

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

时间: 2025-01-01 12:02:52

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

前后端分离模式下的权限控制方案

在前后端分离的模式下,所有的交互场景都变成了数据交互,因此传统业务系统中的权限控制方案在前端已经不再适用(比如使用后台模板标签进行权限控制),需要另外设计权限控制方案. 权限控制的概念 要理解权限控制,需要明白两个概念:资源和权限. 资源:对于一个系统来说,系统内部的所有信息都可以理解为是这个系统的资源.页面是资源.数据是资源.按钮是资源.图片也是资源. 权限:权限就是访问某个资源所需要的标识.无论系统的权限如何设计,在用户登陆的时候都需要计算当前登陆用户所拥有的权限标识集合,这样才能确定这个用

系统权限控制——菜单级别的权限控制方案

系统如果有许多用户,有时候需要针对不同用户进行菜单级别的权限控制. 下面的数据库设计实现了菜单级别的控制,可以作为一个参考: 其中读取页面时,页面中的action从Menu表中读取,而在powerofaction表中存储权限Power表与Aciton的关系. 系统权限控制--菜单级别的权限控制方案

基于url拦截实现权限控制

用户表,角色表,用户角色表,权限表,权限角色表 1.用户通过认证(可以是验证用户名,密码等) 2.登陆拦截器,为公开的url放行, 登陆时,将用户信息放入session中,获得用户的权限集合,将集合放到session中,将用户的看查看的菜单权限放到session,用于显示导航菜单 3.权限拦截器,系统内访问时,可以通过拦截器判断权限集合中有没有此url,如果有,允许操作.没有无权访问

PHP中多IP段权限控制方案

在某些项目中我们可能会用到根据IP段进行权限校验,比如不在我们配置的IP段内的用户访问某些页面或功能模块时,将提示其权限不够并禁止访问该页面的内容.鉴于项目中需求各异,下面只说下大致思路以及我个人的实现方式: 1. 在一个功能模块设计之初,我们应该让它尽可能易于配置,易于使用,易于应用到更多场景中,这里我们采用配置和校验函数分离的方式,将权限校验的代码都写在一个依赖配置数组能独立运行的函数中. 2. 我的思路是多IP段校验过程中,如果被校验的IP不在配置项的所有IP段中,则返回false, 禁止

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

1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 7. 基于treegrid实现菜单展示 2 常见的权限控制方式 2.1 url拦截实现权限控制 shiro基于过滤器实现的   2.2 注解方式实现权限控制 底层:代理技术     3 基于shiro的url拦截方式验权   <!-- 配置过滤器工厂 --> <bean id="

shiro教程(1)-基于url权限管理

shiro教程系列 shiro教程(2) shiro教程(3) shiro教程(4) 一. 权限管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理包括用户身份认证和授权两部分,简称认证授权.对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问. 1.2 用户身份认证 1.2.1 概念 身份认证,就是

转Struts 权限控制

权限最核心的是业务逻辑,具体用什么技术来实现就简单得多. 通常:用户与角色建立多对多关系,角色与业务模块构成多对多关系,权限管理在后者关系中. 对权限的拦截,如果系统请求量大,可以用Struts2拦截器来做,请求量小可以放在filter中.但一般单级拦截还不够,要做到更细粒度的权限控制,还需要多级拦截. 不大理解filter(过滤器)和interceptor(拦截器)的区别,遂google之. 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 . 2.过滤器依赖与servlet容器,

粗粒度与细粒度权限控制

1.1   什么是粗粒度和细粒度权限 粗粒度权限管理,对资源类型的权限管理.资源类型比如:菜单.url连接.用户添加页面.用户信息.类方法.页面中按钮.. 粗粒度权限管理比如:超级管理员可以访问户添加页面.用户信息等全部页面. 部门管理员可以访问用户信息页面包括 页面中所有按钮. 细粒度权限管理,对资源实例的权限管理.资源实例就资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息.行政部的员工. 细粒度权限管理就是数据级别的权限管理. 细粒度权限管理比如:部门经理只可以访问本

036 权限控制介绍 - bos

一.权限概述 1.认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁?? 2.授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能做什么?? 二.常见的权限控制方式 1.URL拦截权限控制 <1>底层基于拦截器或者过滤器实现 <2>用户访问某一url,在过滤器或拦截器中先判定该url是否需要拦截,若需要,则取出当前登录的用户,判定是否具有足够的权限 2.方法注解权限控制 <1>添加某一注解表示该方法需要进行权限控