`
googleyufei
  • 浏览: 4478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

巴巴运动网权限模块实现参考

阅读更多
1. 定义PermissionTag标签:
/**
 * 权限检查标签类
 */
public class PermissionTag extends TagSupport {
	private static final long serialVersionUID = -5285732412976711256L;

	private String module;
	private String privilege;

	@Override
	public int doStartTag() throws JspException {
		boolean result = false;
		Employee employee = WebUtil.getEmployee((HttpServletRequest) pageContext.getRequest());
		SystemPrivilege privilege = new SystemPrivilege(new SystemPrivilegePK(this.module, this.privilege));
		for (PrivilegeGroup group : employee.getGroups()) {
			if (group.getPrivileges().contains(privilege)) {
				result = true;
				break;
			}
		}
		return result ? EVAL_BODY_INCLUDE : SKIP_BODY;
	}

	public String getModule() {
		return module;
	}

	public void setModule(String module) {
		this.module = module;
	}

	public String getPrivilege() {
		return privilege;
	}

	public void setPrivilege(String privilege) {
		this.privilege = privilege;
	}
}

2. 配置标签tld文件
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
  <description>itcast babasport permission taglib</description>
  <display-name>permission taglib</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>itcast</short-name>
  <uri>http://www.itcast.cn/babasport</uri>

  <tag>
    <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description>
    <name>permission</name>
    <tag-class>com.shop.action.privilege.PermissionTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <description>所在模块</description>
        <name>module</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <description>所予权限</description>
        <name>privilege</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>  
</taglib>


3. 在需要进行权限控制的JSP片段中:
<itcast:permission privilege="update" module="product">
 <div align="center"><a href="/shop/control/product/editUI.do?productid=${entry.id}"><img src="/shop/images/edit.gif" width="15" height="16" border="0"></a></div>
</itcast:permission></td>


// ------ 以上还不够, JSP还不是安全的, 要在JAVA程序中在进行过滤:

4. 定义注解Permission:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Permission {
	String module();

	String privilege();
}


5. 在需要进行权限检查的Controller方法上打上注解:
@RequestMapping("/control/product/list")
@Permission(module = "product", privilege = "view")
public String list(ProductBean formbean, HttpServletRequest request) {}

@RequestMapping("/control/product/addUI")
@Permission(module = "product", privilege = "insert")
public String addUI(HttpServletRequest request) throws Exception {}

6. 定义一个Interceptor, 拦截所有需要进行权限检查的URL:
SpringMVC中的实现:
public class PrivilegeRequestInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		// like /shop/control/department/list.do
		String requestURI = WebUtil.getRequestURI(request);
		// like /control/department/list
		String reqMapping = requestURI.substring(5, requestURI.indexOf(".do"));
		Map<String, String[]> reqInfo = new LinkedHashMap<String, String[]>();
		Method targetMethod = getTargetMethod(handler, reqMapping);
		if (reqMapping.startsWith("/control/")) {//只对办公平台中的action进行校验
			boolean validateResult = validate(request, targetMethod);
			reqInfo.put("permission validate:", new String[] { validateResult + "" });
			log.debug("request info: " + getJSONString(reqInfo));
			if (!validateResult) {//没有权限的时候执行下面这段代码
				request.setAttribute("message", "您没有执行该操作的权限");
				request.setAttribute("urladdress", SiteUrl.readUrl("control.control.right"));
				request.getRequestDispatcher("/WEB-INF/page/share/message.jsp").forward(request, response);
				return false;
			}
			return true;
		}
		log.debug("request info: " + getJSONString(reqInfo));
		return true;
	}

	private Method getTargetMethod(Object handler, String reqMapping) {
		Method[] methods = handler.getClass().getDeclaredMethods();
		for (Method method : methods) {
			boolean isAnnoted = method.isAnnotationPresent(RequestMapping.class);
			RequestMapping mappingAnnoted = method.getAnnotation(RequestMapping.class);
			if (isAnnoted && reqMapping.equals(mappingAnnoted.value()[0])) {
				return method;
			}
		}
		return null;
	}

	/**
	 * 权限校验
	 * @return
	 */
	private boolean validate(HttpServletRequest request, Method targetMethod) {
		if (targetMethod == null || !targetMethod.isAnnotationPresent(Permission.class)) {
			return true;
		}
		Permission permission = targetMethod.getAnnotation(Permission.class);//得到方法上的注解
		//下面是得到执行方法需要的权限
		SystemPrivilegePK targetPrivilege = new SystemPrivilegePK(permission.module(), permission.privilege());
		Employee employee = WebUtil.getEmployee(request);
		for (PrivilegeGroup group : employee.getGroups()) {
			for (SystemPrivilege privilege : group.getPrivileges()) {
				if (privilege.getPermission().equals(targetPrivilege)) {
					return true;
				}
			}
		}
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		Collection<String> headNames = response.getHeaderNames();
		for (String headName : headNames) {
			log.debug("HTTP head{" + headName + ":" + response.getHeader(headName) + "}");
		}
		super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex); // 可以在此通过判断ex是否为null,来检查Controller是否抛出了异常.
	}
}

7. 在springmvc-servlet.xml中配置Interceptor:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
	<list>
		<bean class="com.shop.web.support.PrivilegeRequestInterceptor" />
	</list>
</property>
</bean>
分享到:
评论

相关推荐

    百度云 2016年版新巴巴运动网项目12天完整视频教程以及源码

    根据提供的文件信息,我们可以推断出这是一套关于“新巴巴运动网”项目的视频教程及相关源码资料。接下来,我们将围绕这个项目的背景、教程内容、技术栈等方面进行深入解析。 ### 项目背景 “新巴巴运动网”项目...

    巴巴运动网原码

    【巴巴运动网原码】指的是巴巴运动网的源代码,它是构建巴巴运动网这一在线平台的基础。源码是程序员用编程语言编写的未被编译的原始代码,它揭示了网站的功能实现细节、数据处理逻辑以及用户交互方式。了解并研究...

    巴巴运动网源码和jar文件

    巴巴运动网源码和jar文件,完整的源码和用到的jar文件。工程配置后可直接运行。。。

    巴巴运动网 lib3

    1. **框架结构**:首先,我们需要了解巴巴运动网 lib3 的整体框架,包括其模块划分、文件组织和依赖关系。这有助于我们快速定位代码功能,便于后续的开发和维护。 2. **编程语言**:根据项目名称,我们可以推测项目...

    巴巴运动网 部分 前端代码

    巴巴运动网的前端代码中,JavaScript可能用于处理用户输入、更新DOM(文档对象模型)、发送AJAX请求、实现动画效果等。现代JavaScript库和框架,如React、Vue或Angular,可能会被用于构建组件化的应用结构,提升开发...

    巴巴运动网 lib1

    "巴巴运动网 lib1" 提供的jar包很可能是为开发者提供的一种库或者服务,方便他们在开发过程中调用相关的功能或实现。下面我们将深入探讨与jar包相关的知识点,以及如何利用它进行开发和学习。 首先,Java的jar文件...

    10_传智播客巴巴运动网_权限管理模块分析

    "10_传智播客巴巴运动网_权限管理模块分析"这一主题聚焦于如何设计和实现一个有效的权限管理系统。这个主题可能涵盖以下几个关键知识点: 1. **权限模型**:权限模型是权限管理的基础,通常包括角色(Role)、资源...

    巴巴运动网-权限控制.txt

    根据给定文件的信息,我们可以提炼出关于“巴巴运动网—权限控制”的一系列关键知识点,主要围绕权限模型的设计、实现及管理展开。 ### 权限控制背景 “巴巴运动网”作为一个复杂的在线平台,其功能多样且面向不同...

    传智巴巴运动网源代码[两个模块]

    传智巴巴运动网源代码 传智播客巴巴运动网项目实战 基于分布式构架的大型商品交易平台,系统围绕一个业务中心的思想,实现了多种类型的客户端应用,如:基于浏览器的web交易系统,基于手机的wap交易系统,用于内部...

    新巴巴运动网page包

    总结来说,"新巴巴运动网page包"是传智播客新巴巴运动网项目的一个关键组件,提供了分页功能的实现,通过Maven本地仓库的管理,简化了项目的依赖管理和开发流程。对于学习者来说,这是一个了解和实践Java Web开发...

    巴巴运动网源码(传智播客)

    【巴巴运动网源码(传智播客)】是一套基于Java编程语言开发的网站源码,主要用于构建体育运动类的在线服务平台。这套源码在IT教育领域,特别是由传智播客这样的知名教育机构中被用作教学案例,帮助学员理解和实践...

    巴巴运动网源代码-完整版

    【巴巴运动网源代码-完整版】是一个针对体育用品在线销售平台的源代码包,它提供了网站的全套功能实现,适合开发者进行学习、研究或二次开发。巴巴运动网的源代码设计涵盖了电子商务网站的关键模块,包括但不限于...

    巴巴运动网完整源代码

    5. **API接口**:如果巴巴运动网与其他系统集成,可能涉及到API接口的设计和实现,如RESTful API。 6. **性能优化**:可能包含缓存机制、负载均衡、CDN等内容,以提高网站性能和可用性。 7. **测试和调试**:源...

    2016最新版新巴巴运动网数据库+开发文档

    新巴巴运动网数据库和开发文档资源的提供,对于想要了解或进行该项目开发的人员来说,是一份非常宝贵的学习和参考资料。这份2016年的最新版本包含了一系列关键元素,可以帮助开发者更好地理解系统的架构和功能。 ...

    巴巴运动网源代码和JAR文件

    这个资源对于学习Java Web开发,尤其是对巴巴运动网的系统架构和实现逻辑感兴趣的开发者来说,具有很高的参考价值。 源代码是软件开发的核心部分,它由程序员编写,用编程语言描述了程序的运行过程和逻辑。在巴巴...

    新巴巴运动网

    在新巴巴运动网的项目中,JavaScript可能用于处理用户输入、控制页面元素动态显示、实现表单验证、执行AJAX请求与服务器进行异步通信等功能。开发者可能使用了jQuery、React、Vue或Angular等JavaScript库或框架来...

    巴巴运动网源码巴巴运动网源码

    【巴巴运动网源码】是一个基于Java开发的分布式系统,其设计和实现充分展示了现代互联网应用的高效能和可扩展性。在当前的数字化时代,此类源码对于开发者来说是一份宝贵的参考资料,可以帮助他们理解大型网站的架构...

    巴巴运动网完整源代码.rar

    这个压缩包包含了巴巴运动网106集及后续视频的所有源代码,这对于学习网站开发,尤其是运动类在线平台的构建具有很高的参考价值。 1. **网站框架与技术栈** - 源代码可能基于常见的Web开发框架,如Spring Boot或...

    传智巴巴运动网源代码

    以上是对"传智巴巴运动网源代码"中可能涉及的技术栈和核心知识点的解读,实际的源代码可能会根据项目需求和开发团队选择采用不同的技术和实现方式。深入研究这套源代码,开发者可以学习到一套完整的网站开发流程,...

Global site tag (gtag.js) - Google Analytics