`
ayhome
  • 浏览: 32881 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

AySuite---权限模块的实现

    博客分类:
  • JAVA
阅读更多

      在设计好RBAC之后就是实现了,AySuite是基于ETMVC框架的,ETMVC提供了很好的过滤器支持,其中有前置过滤器、后置过滤器和环绕过滤器,在环绕过滤器中可以这样设计:获取当前URL从中得出controller和action(在ETMVC中这是很容易得到的),也就等于得到了module中的Directory,具体思路如下

  1. 列出当前用户所属的所有角色
  2. 列出当前所属的所有角色对应的权限值(这里其实可以把所有角色的权限值都缓存起来:缓存表 RolePermission)
  3. 根据当前controller得到路径所对应的模块ID
  4. 根据当前模块ID查询模块ID所对应所有角色和权限值
  5. 把2和4进行比较

过滤器主要代码如下String actionName = controller.getActionName();//得到当前action

String controllerName = controller.getControllerName();//得到当前controller
int PermissonValue = 0;		
if (actionName.toLowerCase()=="index"){
  actionName = "list";//在action中 inde与list相等
}	
if (actionName=="saveedit")
  actionName="edit";//saveedit 与edit 相等
else if(actionName=="savecreate")
  actionName="create";//savecreate 与create 相等
for (String s:Permission.PopedomType().keySet()){
  if (actionName==s.toLowerCase())
    PermissonValue = Permission.PopedomType().get(s);
}
return Permission.CheckPermission(userid, controllerName, PermissonValue);


 Permission 权限相关类


/* ***********************************************
 * author :  Anyhome
 * email  :  ayhome@gmail.com 
 * function: 
 * @date 2009-12-26
 * history:  created by Anyhome
 * ***********************************************/
 
/**
 * 
 */
package org.anyhome;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.anyhome.models.MyModule;
import org.anyhome.models.MyPermissionValue;
import org.anyhome.models.MyRolePermission;
import org.anyhome.models.MyUserRoles;

import com.et.ar.exception.ActiveRecordException;

/**
 * @author anyhome
 *
 */
public class Permission {	
	public static CacheManager cache = CacheManager.getInstance(); //使用了OSCACHE 
	public static Map<String, Integer> PopedomType(){		
		Map<String, Integer> popedomType = new HashMap<String, Integer>();
		if (cache.get("popedomType")==null){			
			popedomType.put("Details", 2);		
			popedomType.put("Create", 4);
			popedomType.put("Edit", 8);
			popedomType.put("Delete", 16);
			popedomType.put("Orderby", 32);
			popedomType.put("Print", 64);
			popedomType.put("List", 128);	
			cache.put(popedomType, "popedomType", new String[] {"groups"});//缓存起来
		}else{
			popedomType = (Map<String, Integer>)cache.get("popedomType");		
		}
		return popedomType;		
	}
	
	/**
	 * 根据用户ID controller 检查是否包含 权限值 CheckValue 这里做了个环绕检查 即循环检查多个角色
	 * @param UserID
	 * @param Directory
	 * @param CheckValue
	 * @return
	 * @throws ActiveRecordException
	 */
	public static Boolean CheckPermission(int UserID,String Directory, int CheckValue) throws ActiveRecordException{				
		List<MyRolePermission> myRolePermission =PermissionValueList(UserID,Directory);
		if (myRolePermission==null)
			return false;
		for(MyRolePermission itme:myRolePermission){
			if ((itme.getP_Value()&CheckValue)==CheckValue)
				return true;
		}
		return false;
	}	
	
	/**
	 * 根据用户获取所属角色
	 * @param userId
	 * @return
	 * @throws ActiveRecordException
	 */
	@SuppressWarnings({ "unchecked"})
	private static List<MyUserRoles> UserRoles(int userId) throws ActiveRecordException{
		String key = userId + "-Roles";
		if (cache.get(key)!=null){			
			return (List<MyUserRoles>)cache.get(key);
		}else{
			List<MyUserRoles> Roles = MyUserRoles.findAll(MyUserRoles.class,
					"R_UserID=?",new Object[]{userId});
			cache.put(Roles, key, new String[]{"UserRoleskey"});
			return (List<MyUserRoles>)cache.get(key);
		}
	}
	
	/**
	 * 根据角色和模块代码 获取 权限实体
	 * @param rolesId
	 * @param PageCode
	 * @return
	 * @throws ActiveRecordException
	 */
	private static MyRolePermission RolePermission(int rolesId,String PageCode) throws ActiveRecordException{
		String key = rolesId + "-Permission-"+PageCode;
		MyRolePermission e = new MyRolePermission();
		if (cache.get(key)!=null){
			return (MyRolePermission)cache.get(key);			
		}else{
			e = MyRolePermission.findFirst(MyRolePermission.class,
					"P_RoleID=? and P_PageCode=?",new Object[]{rolesId,PageCode});
			if (e!=null){
				cache.put(e, key, new String[]{"RolePermissionkey"});
				return (MyRolePermission)cache.get(key);
			}else{
				return null;
			}			
		}
	}
	
	/**
	 * 列出指定用户的所有 MyRolePermission
	 * @param userId
	 * @param Directory
	 * @return
	 * @throws ActiveRecordException
	 */
	public static List<MyRolePermission> PermissionValueList(int userId,String Directory) throws ActiveRecordException{
		List<MyUserRoles> userRoles = UserRoles(userId);
		if (UserRoles(userId)==null)
			return null;
		String key = Directory + "-Directory-Module";			
		String PageCode = "";
		if (cache.get(key)!=null){
			PageCode = ((MyModule)cache.get(key)).getM_PageCode();
		}else{
			MyModule myModule = MyModule.findFirst(MyModule.class,
					"M_Directory=?",new Object[]{Directory});
			cache.put(myModule, key, new String[]{"Modulekey"});
			PageCode = ((MyModule)cache.get(key)).getM_PageCode();
		}
		List<MyRolePermission> myRolePermission = new ArrayList<MyRolePermission>();
		for(MyUserRoles item:userRoles){
			MyRolePermission e = RolePermission(item.getR_RoleID(),PageCode);
			if (e!=null)
				myRolePermission.add(e);
		}		
		return myRolePermission;
	}

	
}
 
分享到:
评论
1 楼 liuxiang00435057 2012-10-19  
项目取下来,有错误呢

相关推荐

    rockyou.txt

    rockyou

    ASP+ACCESS网上人才信息管理系统(源代码+论文)【ASP】.zip

    ASP+ACCESS网上人才信息管理系统(源代码+论文)【ASP】

    河北金融学院经济大数据课设2024年 软科学校爬虫课设

    河北金融学院经济大数据课设2024年 软科学校爬虫课设

    widgetsnbextension-4.0.0b0-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    协同过滤服务+源代码+文档说明

    - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    基于ASP公交在线查询系统设计(源代码+论文)【ASP】.zip

    基于ASP公交在线查询系统设计(源代码+论文)【ASP】

    ASP.NET某中学图书馆系统的设计与实现(源代码+论文)【ASP】.zip

    ASP.NET某中学图书馆系统的设计与实现(源代码+论文)【ASP】

    ASP.NET猜数游戏的设计与开发(源代码+论文)【ASP】.zip

    ASP.NET猜数游戏的设计与开发(源代码+论文)【ASP】

    asp.net师电子化信息库的设计与实现(源代码+论文)【ASP】.zip

    asp.net师电子化信息库的设计与实现(源代码+论文)【ASP】

    2023-04-06-项目笔记 - 第一百五十六阶段 - 4.4.2.154全局变量的作用域-154 -2024.06.06

    2023-04-06-项目笔记-第一百五十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.154全局变量的作用域_154- 2024-06-06

    哈尔滨工程大学833社会研究方法2020考研专业课初试大纲.pdf

    哈尔滨工程大学考研初试大纲

    grpcio-1.27.2-cp36-cp36m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于Java的大学生综合评测系统(源码+论文+数据库文件+演示视频).zip

    系统可以实现的功能有: 管理员: 用户管理:对管理员信息进行管理。 班级信息管理:添加和修改,管理班级信息,包括对班级人数,班主任姓名进行管理。 科目信息管理: 对科目的学时,学分,类型进行管理。 教师信息管理:管理教师的基本信息。 学生信息管理:学生班级,姓名,性别,电话,密码等信息进行管理。 学生成绩管理:普通成绩,德育加分,干部加分等成绩。 综合查询:通过学号和姓名,查询学生的平均成绩,干部,德育分数和总分。 普通管理员(教师) 班级信息管理:添加和修改,管理班级信息,包括对班级人数,班主任姓名进行管理。 科目信息管理: 对科目的学时,学分,类型进行管理。 教师信息管理:管理教师的基本信息。 学生信息管理:学生班级,姓名,性别,电话,密码等信息进行管理。 学生成绩管理:普通成绩,德育加分,干部加分等成绩。 综合查询:通过学号和姓名,查询学生的平均成绩,干部,德育分数和总分。 学生 个人资料:修改个人资料信息。 自我评价:对自己的基本情况进行评价。 综合查询:对个人的成绩,学年,课程的成绩进行查询,并能打印。

    ASP.NET+SQL房地产管理系统设计与实现(开题报告+源代码+论文+任务书+工作总结+答辩PPT)【ASP】.zip

    ASP.NET+SQL房地产管理系统设计与实现(开题报告+源代码+论文+任务书+工作总结+答辩PPT)【ASP】

    基于python+pyqt5开发的俄罗斯方块游戏源码+使用说明.zip

    基于python+pyqt5开发的俄罗斯方块游戏源码+使用说明.zip基于python+pyqt5开发的俄罗斯方块游戏源码+使用说明.zip 【优质项目推荐】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、项目初期立项演示等用途。 4.如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能。 功能 播放音乐 暂停游戏 消除方块的音效 窗口自由拖拽 游戏存档 安装和运行 ### 1. 使用`pip` ```shell # csdn下载此项目源码解压重命名为PyQt5-Tetris(不要有中文路径) 进入到项目 cd PyQt5-Tetris # 使用pip安装依赖 pip install -r requirements.txt # 运行 python main.py ``` ### 2. 使用`pipenv` ```shell # csdn下载此项目源码解压重命名为PyQt5-Tetris(不要有中文路径) # 进入到项目 cd PyQt5-Tetris # 使用pipenv安装依赖 pipenv sync # 运行 pipenv run start ``` ### 3. 按键说明 - `A` - 向左移动 - `D`- 向右移动 - `W` - 变形 - `S` - 加速下降 - `P` - 暂停 - `ESC` - 退出程序 ## PyInstaller 打包 ### 1. 使用`pip` ```shell # 安装依赖 pip install -r requirements-dev.txt # 打包,打包成功之后exe文件在dist文件夹下 pyinstaller main.spec ``` ### 2. 使用`pipenv` ```shell # 安装依赖 pipenv install --dev # 打包,打包成功之后exe文件在dist文件夹下 pipenv run build ```

    cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    华为OD机试华为OD机试华为OD机试2024最新最全真题

    2024版华为OD机试题库,包含C、D卷所有真题,粉丝可领取体验卡免费看题,包含面试手撕代码等等内容

    intel_openmp-2024.0.3-py2.py3-none-win32.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ASP.NET基于CS结构的企业人事管理系统的设计与实现(源代码+论文)【ASP】.zip

    ASP.NET基于CS结构的企业人事管理系统的设计与实现(源代码+论文)【ASP】

    基于协同过滤推荐算法的在线教育平台的前端模块(前后端分离)+源代码+文档说明

    - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

Global site tag (gtag.js) - Google Analytics