`
ayhome
  • 浏览: 33521 次
  • 性别: 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  
项目取下来,有错误呢

相关推荐

    YOLO算法-城市电杆数据集-496张图像带标签-电杆.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    (177406840)JAVA图书管理系统毕业设计(源代码+论文).rar

    JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代

    (35734838)信号与系统实验一实验报告

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    YOLO算法-椅子检测故障数据集-300张图像带标签.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    基于小程序的新冠抗原自测平台小程序源代码(java+小程序+mysql+LW).zip

    系统可以提供信息显示和相应服务,其管理新冠抗原自测平台小程序信息,查看新冠抗原自测平台小程序信息,管理新冠抗原自测平台小程序。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7 小程序开发工具:hbuildx/微信开发者工具

    YOLO算法-俯视视角草原绵羊检测数据集-4133张图像带标签-羊.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    (171674830)PYQT5+openCV项目实战:微循环仪图片、视频记录和人工对比软件源码

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    新建 文本文档.docx

    新建 文本文档.docx

    hw06.zip

    hw06

    3. Kafka入门-安装与基本命令

    3. Kafka入门-安装与基本命令

    燃气管道施工资质和特种设备安装改造维修委托函.docx

    燃气管道施工资质和特种设备安装改造维修委托函.docx

    The state of AI 2024.pdf

    AI大模型研究相关报告

    lab02.zip

    lab02

    Unity视频插件AVPro的Win端2.2.3

    仅供学习使用,其他用途请购买正版资源AVPro Video Core Windows Edition 2.2.3 亲测可用的视频播放插件,能丝滑播放透明视频等.

    建设工程消防验收现场指导意见表.docx

    建设工程消防验收现场指导意见表.docx

    MVIMG_20241222_194113.jpg

    MVIMG_20241222_194113.jpg

    五相电机双闭环矢量控制模型-采用邻近四矢量SVPWM-MATLAB-Simulink仿真模型包括: (1)原理说明文档(重要):包括扇区判断、矢量作用时间计算、矢量作用顺序及切时间计算、PWM波的生成

    五相电机双闭环矢量控制模型_采用邻近四矢量SVPWM_MATLAB_Simulink仿真模型包括: (1)原理说明文档(重要):包括扇区判断、矢量作用时间计算、矢量作用顺序及切时间计算、PWM波的生成; (2)输出部分仿真波形及仿真说明文档; (3)完整版仿真模型:包括邻近四矢量SVPWM模型和完整双闭环矢量控制Simulink模型; 资料介绍过程十分详细,零基础手把手教学,资料已经写的很清楚

    YOLO算法-锡罐-牙罐-盖子打开数据集-179张图像带标签-锡罐-牙罐-盖子打开.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    java毕设项目之ssm基于JSP的乡镇自来水收费系统+jsp(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

Global site tag (gtag.js) - Google Analytics