文档章节

SSH实现一个简单的权限控制实例(三)

丶KKdo
 丶KKdo
发布于 2016/08/14 13:24
字数 666
阅读 17
收藏 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的权和来实现.

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

© 著作权归作者所有

共有 人打赏支持
丶KKdo
粉丝 1
博文 24
码字总数 13683
作品 0
成都
程序员
openstack manila服务折腾笔记

国庆在家折腾了一把openstack manila,看了下现网还没有中文的manila入门介绍,于是决定写个笔记贴出来 一、manila简介 和我们传统存储服务器一样,openstack的存储也分为3种:块存储(cinder),对...

superbigsea
2017/10/07
0
0
expect实现自动交互由浅入深

expect实现自动交互由浅入深 作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如t...

JAYZ_HAO
2017/10/14
0
0
Ubuntu-16.04 部署 OpenStack Ocata

六、配置 Dashboard 仪表盘服务(Controller Node) 1.配置Dashboard # apt -y install openstack-dashboard vim /etc/openstack-dashboard/local_settings.py OPENSTACK_HOST = "192.168.30.......

结束的伤感
2017/04/01
0
0
Apache Shiro 使用手册(三)Shiro 授权

一、授权的三要素 授权有着三个核心元素:权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清...

heroShane
2014/02/10
0
0
shiro 授权介绍

一、授权的三要素 授权有着三个核心元素:权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清...

kevin728971010
2016/11/07
18
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring-boot | 日志

引言 好久不见,都还好吗? 大家都知道,我一般都是带来实用的东西,这次也一样,我们来试试项目开发中的日志处理。 理论知识 1、为什么要用日志?你是否因为项目出现问题,查找日志文件定位...

成都_小冯同学
19分钟前
0
0
dubbo下的补偿实现(一)

背景 由于前面几篇文章涉及的问题 分布式事务的思考 在我们微服务的场景下 各种本地事务都没有办法控制的很好。 A服务调用B服务 当B服务成功提交之后 A发生了异常 这种情况下要如何处理呢??...

Mr_Qi
27分钟前
2
0
HTML显示json字符串并且进行格式化

通过pre标签进行格式化展示,使用JSON.stringify()方法转换。 代码如下:   <html> <head> <title>HTML显示json字符串并且进行格式化</title> </head> <body> <p id="show_p">{ "name": "B......

writeademo
48分钟前
0
0
LNMP——php-fpm

php-fpm的pool •vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加include并删除我们之前www池子 • include = etc/php-fpm.d/*.conf • mkdir /usr/local/php/etc/php-fpm.d/ • ......

chencheng-linux
51分钟前
0
0
TensorFlow layers slim 模块搭建cnn对mnist分类,比较bn效果

shape变化 (?, 784)(?, 28, 28, 1)(?, 14, 14, 8)(?, 7, 7, 8)(?, 1, 1, 8)(?, 8)(?, 10) 结果对比,基本上还是有点用的 0.91725457 0.9232 0.9548 0.95530.9177273 0.9234 0....

阿豪boy
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部