文档章节

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

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

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

© 著作权归作者所有

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

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

superbigsea ⋅ 2017/10/07 ⋅ 0

expect实现自动交互由浅入深

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

JAYZ_HAO ⋅ 2017/10/14 ⋅ 0

docker环境配置

转发自http://www.blogjava.net/yongboy/archive/2013/12/12/407498.html docker官网:https://www.docker.io/ github源码:https://github.com/dotcloud/docker 原文 前言 Docker旨在提供一......

leaf志良 ⋅ 2013/12/17 ⋅ 10

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

Apache Shiro 使用手册(三)Shiro 授权

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

heroShane ⋅ 2014/02/10 ⋅ 0

shiro 授权介绍

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

kevin728971010 ⋅ 2016/11/07 ⋅ 0

KVM虚拟化管理平台VManagePlatform

VManagePlatform是什么? 一个KVM虚拟化管理平台 开发语言与框架: 编程语言:Python2.7 + HTML + JScripts 前端Web框架:Bootstrap 后端Web框架:Django 后端Task框架:Celery + Redis VMan...

welliamcao ⋅ 2017/02/20 ⋅ 0

RBAC权限控制

名词解释: RBAC:Role-Based Access Control,基于角色的访问控制 关键词: RBAC,Java Shiro,Spring Security, 一. RBAC 要解决的常见问题 问题一:对某一个用户只授予一些特殊的权限 描...

郭恩洲_OSC博客 ⋅ 2015/02/26 ⋅ 0

[WCF权限控制]WCF自定义授权体系详解[实例篇]

在《原理篇》中,我们谈到WCF自定义授权体系具有两个核心的组件:AuthorizationPolicy和ServiceAuthorizationManager,已经它们是如何写作最终提供一种基于声明的授权实现。为了让自定义授权...

长平狐 ⋅ 2012/09/04 ⋅ 0

servlet实现MVC

jsp+servlet+javabean实现ssh的mvc模式 干了很久的项目都是使用SSH框架的,现在团队有位搞美工的美女突然想要搞java了,让我做下指导并打个基本的框架,需要使用最基本的架构,这样说来那SSH...

蜡笔小小小新 ⋅ 2016/02/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

来自一个优秀Java工程师的简历

写在前面: 鉴于前几天的一份前端简历,虽然带着很多不看好的声音,但却帮助了很多正在求职路上的人,不管评论怎么说,我还是决定要贴出一份后端的简历。 XXX ID:357912485 目前正在找工作 ...

颖伙虫 ⋅ 17分钟前 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部