SSH实现一个简单的权限控制实例(三)
博客专区 > 丶KKdo 的博客 > 博客详情
SSH实现一个简单的权限控制实例(三)
丶KKdo 发表于1年前
SSH实现一个简单的权限控制实例(三)
  • 发表于 1年前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0

最简单的权限验证方式代码:

 

public class RightsUtils {
	public static boolean testRight(String menuId, String[] rights) {
		for(String right : rights) {
			if(menuId.equals(right)) {
				return true;
			}
		}
		return false;
	}
}
通过判断数据库中的权限是否包含了给定的url,也就是菜单的ID.

上文已经有了struts的自定义拦截器,用来拦截未登录的用户,拦截的方法是auth,编写auth用来处理用户的菜单权限:

@Component @Scope("prototype")
public class AuthAction extends ActionSupport {
	@Resource
	private RoleService roleService;

	@SuppressWarnings("unchecked")
	public String authCheck() {
		User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
		String rights = user.getRights();
		Integer roleId = user.getRoleId();
		Role role = roleService.findById(roleId);
		rights += "," + role.getRights();
		if(rights != null) {
			String[] rightsArray = rights.split(",");
			List<String> list = new ArrayList<String>();  
	        for (int i=0; i<rightsArray.length; i++) {  
	            if(!list.contains(rightsArray[i])) {  
	                list.add(rightsArray[i]);  
	            }  
	        }  
	        rightsArray = list.toArray(new String[list.size()]);
			List<Menu> menuList = (List<Menu>) ServletActionContext.getRequest().getSession().getAttribute("menuList");
			for(Menu menu : menuList) {
				menu.setHasMenu(RightsUtils.testRight(menu.getMenuId().toString(), rightsArray));
				for(Menu submenu : menu.getSubMenu()) {
					submenu.setHasMenu(RightsUtils.testRight(submenu.getMenuId().toString(), rightsArray));
				}
			}
		}
		return SUCCESS;	
	}
}

这样,就会根据用户所属角色和自身拥有的权限来展示给不同用户不同的界面可操作信息.

在菜单表中插入一些数据:

在角色表中插入几条测试数据:

用户表中也插入几条测试数据分别属于三种角色中的一种:

然后登录不同的用户:

管理员:

user1:

可以看到已经能够正确的过滤掉一些菜单.

当然这个方法是很不好的,还有一种验证菜单权限的方法:

public class RightsHelper {
	/**
	 * 利用BigInteger对权限进行2的权的和计算
	 * @param rights int型权限编码数组
	 * @return 2的权的和
	 */
	public static BigInteger sumRights(int[] rights){
		BigInteger num = new BigInteger("0");
		for(int i=0; i<rights.length; i++){
			num = num.setBit(rights[i]);
		}
		return num;
	}
	/**
	 * 利用BigInteger对权限进行2的权的和计算
	 * @param rights String型权限编码数组
	 * @return 2的权的和
	 */
	public static BigInteger sumRights(String[] rights){
		BigInteger num = new BigInteger("0");
		for(int i=0; i<rights.length; i++){
			num = num.setBit(Integer.parseInt(rights[i]));
		}
		return num;
	}
	
	/**
	 * 测试是否具有指定编码的权限
	 * @param sum
	 * @param targetRights
	 * @return
	 */
	public static boolean testRights(BigInteger sum,int targetRights){
		return sum.testBit(targetRights);
	}
	
	/**
	 * 测试是否具有指定编码的权限
	 * @param sum
	 * @param targetRights
	 * @return
	 */
	public static boolean testRights(String sum,int targetRights){
		if(Tools.isEmpty(sum))
			return false;
		return testRights(new BigInteger(sum),targetRights);
	}
	
	/**
	 * 测试是否具有指定编码的权限
	 * @param sum
	 * @param targetRights
	 * @return
	 */
	public static boolean testRights(String sum,String targetRights){
		if(Tools.isEmpty(sum))
			return false;
		return testRights(new BigInteger(sum),targetRights);
	}
	
	/**
	 * 测试是否具有指定编码的权限
	 * @param sum
	 * @param targetRights
	 * @return
	 */
	public static boolean testRights(BigInteger sum,String targetRights){
		return testRights(sum,Integer.parseInt(targetRights));
	}
	
	public static void main(String[] args) {
		BigInteger i = new BigInteger("35822");
		boolean a = testRights(i, 12);
		System.out.println(a);
		//int[] rights = {2,9,8,15,3,10,11,12,16,17,18,20};
		int[] rights = {2,3,5,6,7,8,11,15,9};
		System.out.println(sumRights(rights));
	}
}

用菜单的Id进行2的权和来实现.

这样,基本就能实现一个最基本的权限控制.

共有 人打赏支持
粉丝 2
博文 22
码字总数 13683
×
丶KKdo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: