AySuite---权限模块的实现

本文介绍了一种基于ETMVC框架的RBAC权限系统实现方案,通过环绕过滤器获取当前请求的控制器和动作,进而判断用户是否有执行相应操作的权限。

      在设计好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;
	}

	
}
 
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值