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

相关推荐

    55links友情链接网址跟踪器

    55links友情链接网址跟踪器,放在桌面,每次直接打开就可以访问55links友情链接交易平台,方便快捷。

    [AB PLC例程源码][MMS_046180]CompactFlash Data Storage.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    moore_01_0909.pdf

    moore_01_0909

    FIBR English learning

    FIBR English learning

    [AB PLC例程源码][MMS_042350]How to send-receive SMS text messages using Westermo modem.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    OIF_IEEE802.3_liaison_19OCt09.pdf

    OIF_IEEE802.3_liaison_19OCt09

    SerU,做网络安全FTP内容的实验必备

    做网络安全FTP内容的实验必备

    nagarajan_01_1107.pdf

    nagarajan_01_1107

    [AB PLC例程源码][MMS_043879]Programming in SFC and ST Language.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    mellitz_3cd_01_0318.pdf

    mellitz_3cd_01_0318

    PyQt6实战派 配套代码

    PyQt6实战派 配套代码

    陕西省省级非物质文化遗产民俗经纬度数据统计表

    陕西省省级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 地理经度 7. 地理纬度 该统计表系统记录了陕西省省级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。

    ran_3ck_02a_0918.pdf

    ran_3ck_02a_0918

    毕业设计-基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】50308.zip

    毕业设计_基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】【50308】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码; 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:汽车管理、客户管理、租赁订单 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!

    Runcorder - 跑步训练管理系统

    # Runcorder - 跑步训练管理系统 Runcorder 是一款专为跑步爱好者、马拉松运动员及高校体育生设计的本地化跑步训练管理工具,基于 Python 开发,结合 Tkinter 图形界面与强大的数据处理能力,为用户提供从训练记录到数据分析的全方位支持。无论是初学者还是专业跑者,Runcorder 都能帮助你科学规划训练、精准追踪进度,并通过可视化图表直观呈现训练成果,让你的跑步训练更智能、更高效! - **多用户管理**:支持创建、加载和删除用户档案,每个用户的数据独立存储,确保隐私与安全。 - **科学训练记录**:全维度记录跑步数据,包括日期、里程、配速、自评和晨跑标记,支持智能输入校验,避免数据错误。 - **多维数据分析**:通过动态可视化图表展示跑步里程趋势、平均配速曲线,支持自定义 Y 轴范围,帮助用户深入理解训练效果。 - **高阶功能**:提供 4 种科学训练模式(有氧/无氧/混合),支持历史记录修改与删除,数据以 JSON 格式持久化存储,跨平台兼容。

    paatzsch_01_0708.pdf

    paatzsch_01_0708

    开源AI工具下载——AnythingLLMDesktop1.7.3-r2 windows版

    AnythingLLM是一个全栈应用程序,您可以使用流行的开源大语言模型,再结合向量数据库解决方案构建个人本地AI大模型知识库

    mellitz_3ck_02_0519.pdf

    mellitz_3ck_02_0519

    petrilla_01_0708.pdf

    petrilla_01_0708

    ran_3ck_01_0918.pdf

    ran_3ck_01_0918

Global site tag (gtag.js) - Google Analytics