当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

JAVA(ssh2框架)+Flex实现权限控制方案分析

发表于: 2011-07-22   作者:白糖_   来源:转载   浏览:
摘要:   目前项目使用的是Struts2+Hibernate+Spring的架构模式,目前已经有一套针对SSH2的权限系统,运行良好。但是项目有了新需求:在目前系统的基础上使用Flex逐步取代JSP,在取代JSP过程中可能存在Flex与JSP并存的情况,所以权限系统需要进行修改。 【SSH2权限系统的实现机制】 权限控制分为页面和后台两块:不同类型用户的帐号分配的访问权限是不同的,用户使

 

目前项目使用的是Struts2+Hibernate+Spring的架构模式,目前已经有一套针对SSH2的权限系统,运行良好。但是项目有了新需求:在目前系统的基础上使用Flex逐步取代JSP,在取代JSP过程中可能存在FlexJSP并存的情况,所以权限系统需要进行修改。

SSH2权限系统的实现机制】

权限控制分为页面和后台两块:不同类型用户的帐号分配的访问权限是不同的,用户使用帐号登录系统以后,在页面中只能看到拥有权限的页面,并且如果用户通过浏览器直接输入链接地址,后台会判断该用户是否拥有该权限,如果没有则拒绝用户的请求。比如有个人信息管理和交易管理两个模块,管理员给用户A创建了一个帐号,并且给该帐号分配了可访问“个人信息管理”模块的权限,那么用户A登录系统后就只能看到“个人信息管理”的页面,“交易管理”页面是看不到的。那么用户可能知道访问“个人信息管理”的路径,可以在浏览器中输入请求地址,这时后台spring aop截获请求,然后判断该用户是否拥有该模块的访问权限,如果没有则抛出“没有权限”的错误消息,再通过拦截器控制直接返回到页面。

页面实现权限控制的方式比较简单:登录成功后将该用户拥有的所有权限放入session中,用户访问JSP页面时,从session中取得权限,然后在onload事件中遍历页面标签与session中的权限比对,判断标签是否有效,如果无效就不显示或者设为disable,如果有效则显示给用户。

后台实现权限控制使用了拦截器和AOP等机制:AOP过滤访问权限,无权限则抛出异常;拦截器捕获异常,最后返回相应错误消息到页面。

Spring AOP在用户访问Action某方法之前验证该用户是否拥有访问该方法的权限,如果可访问则放行,否则抛出无权限的自定义异常,随后Struts2拦截器会捕获异常,并且把“无访问权限”的错误消息发送的页面。

 

/**
	 * about version :1.00
	 * Description :检查权限
	 * @throws Throwable 
	 */
	public Object checkPriv(ProceedingJoinPoint pjp) throws Throwable{	
		
		//获取当前请求的用户信息和请求路径
		user = ...
		accessUrl = ...
		//调用检查权限的方法,如果验证通过则允许继续执行,否则抛出无权限的异常
		if (service.hasPriv(user, accessUrl)) {
			return pjp.proceed();
		} else {
			throw new FunctionException(Constant4OSPMSException.NO_PRIVILEGE, "user has not privilege to do this!");
		}
	}
	
	private PrivCtrlService service;
	/**
	 * @return the service
	 */
	public PrivCtrlService getService() {
		return service;
	}

 

拦截器是Struts2框架的核心,从页面发送请求到后台以及从后台返回消息到页面都会经过拦截器,其功能类似于filter。在自带的拦截器内再包一层异常拦截器,如果项目发送异常,在自定义拦截器中捕获异常信息,并且根据异常id返回相应的异常消息。

 

 

  • FlexJava整合

关于FlexJava整合都说烂了:HttpServiceWeb ServiceRemoteObject

HttpService等同于JSP中的Ajax请求,向服务器发送请求地址,然后通过Action返回响应数据,最后通过回调的形式获取Action的响应数据。这种形式可以延续使用Struts2,但是需要重新做一套针对Flex调用的Action(因为是Ajax,没法以return的形式重定向了)

Web Service除非跨语言、跨项目,通常不常用。

RemoteObject 直接调用 Java 类中的方法,这种方式不直接依赖于 Servlet 容器,使用中间件(如 BlazeDS )实现双方的通信。

  • Flex权限解决方案

针对Flex权限对接有两种方案:

方案一:所有Flex请求均以Http形式访问Java服务,这样请求依然通过Struts2,原SSH2权限依然可用。使用此方案则当前项目MVC代码基本全部废弃,因为目前项目使用了大量表单提交、重定向,这些对Flex均不实用,全部都得改成Ajax形式通过PrintWriter输出数据给Flex

    方案二:通过 RemoteObject 形式直接调用 Java 方法,再通过回调函数获取 Java 返回的数据。使用此方案则当前项目可以脱离 Struts2 ,直接调用业务逻辑层( Service 层)代码即可。但是权限需要再做一套针对 Service AOP 拦截,同时因为开发成员水平不同,对业务层与表示层的耦合关系理解有差异,有些业务功能可能是写在表示层,所以 Service 的代码也需要进行一定的修改整合。
     针对Flex权限验证的Spring AOP 代码如下:
public Object checkPriv(ProceedingJoinPoint pjp) throws Throwable{
		//通过session获取权限的数据
		FlexSession session = FlexContext.getFlexSession();
		String privUrl = (String) session.getAttribute(Constant4Login.PRIVILEGE_SESSION);
		
		if(privUrl==null){
			System.out.println("Session失效...");
			//抛出异常信息
			throw new RuntimeException(…);
		}
		
		//获取切入的方法名
		String methodName = getMethodName(pjp);
		//获取切入的类全名
		String className = getDeclaringClass(pjp);
		//累全名和方法名拼接起来作为权限校验规则
		methodName = className+"."+methodName;
		//获取权限资源
		String privs[] = privUrl.split("@");
		for (String string : privs) {
			//如果拥有权限则直接通过...
			if(isEQuals(string, methodName)){
				System.out.println("权限通过....");
				return pjp.proceed();
			}
		}
		System.out.println("权限未通过...");
		//抛出无权限异常
		throw new RuntimeException(…);
	}
 
Flex 端通过 RemoteObject 监听异常消息:
remote.addEventListener(FaultEvent.FAULT,error_);
private function error_(event:FaultEvent):void{
	Alert.show(event.toString());
}
 优劣分析:
    方案一: [ ] 可以沿用现今的 SSH2 权限系统    [ ]Action 需要重新定制,运行效率相对慢。

 

    方案二: [ ] 运行效率快     [ ] 如何与 struts2 混用(即有的使用 jsp 、有的使用 flex )可能存在 jsp 请求后台时出现超过两次的权限校验的情况(两套 AOP ),业务层代码可能需要重构。

JAVA(ssh2框架)+Flex实现权限控制方案分析

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
引言 在前几天师哥找到我们让我们给项目加上权限控制,当时在我们印象中权限是一个非 常神圣的系统
问题:实际应用环境中,不同角色的人可能对数据具有不同的访问权限,通过直接在SQL语句中筛选出需要
Java报表FineReport通过权限控制数据访问方案 问题:实际应用环境中,不同角色的人可能对数据具有不
这两天开始敲代码了,让用SSH2框架,以前没有接触过Java项目更没有接触过SSH2框架,所以用注册开始
在一个BI系统中,一般都有多个用户同时使用。在进行分析时,每个用户只需看到他自己的数据即可。在B
2006 年 8 月 14 日 Java 提供了语言级别的线程支持,所以在 Java 中使用多线程相对于 C,C++ 来说
2006 年 8 月 14 日 Java 提供了语言级别的线程支持,所以在 Java 中使用多线程相对于 C,C++ 来说
2006 年 8 月 14 日 Java 提供了语言级别的线程支持,所以在 Java 中使用多线程相对于 C,C++ 来说
1. 前言 作为一个图形用户界面开发人员,都会被繁复的界面呈现权限逻辑困扰过,多年来,界面开发的
转自: http://blogold.chinaunix.net/u/26185/showart_1386463.html 概述 从ioctl这个名称上看,它
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号