系统角色权限设计与实现

1.设计理念

 网上有很多角色权限验证的框架,这里是小编自己悟的一个思路不知道方便不方便大家伙可以参考一下角色权限的设计思路。(本思路适合ifram嵌套页面和正常跳转页面两种,具体实现是ifram页面的具体实现)

a:首先第一点就是设计数据库:

下面先说说说说涉及到的表吧--

资源表(这里是存放项目资源信息的表,比如说项目的菜单URL,菜单的名称,功能菜单的URL,功能名称,及唯一的标识码)。

角色表(这里是存放用户角色的信息)

资源角色关联表(存放用户角色所关联的资源ID信息)

b:后台的实现思路:

主要验证登陆用户的角色信息的过滤都是放在项目拦截器中,可以自定义一个注解标识controller里面的方法请求之前会验证用户的角色是否包含这个url不包含的就是没有权限操作的模块。

c:前台的实现思路:

前台的作用就是控制隐藏菜单和功能按钮。怎么控制呢--

第一步就是先动态加载出来菜单:用户登陆后第一步就是从后台用户角色信息中吧所有的资源菜单关联出来在前台循环出来菜单。

第二步就是把所有的功能按钮都给获取存到前台JSP或者JS中,然后定义过滤按钮的规则,这边可以自定义标签的中属性R_V,

使用JS获取每个加载的页面所有的标签,在获取自定义的属性R_V标签,当然R_V标签中写的是每个标签在资源表中的唯一标识。

第三步就是使用JS获取R_V标签中的属性值和保存的所有功能按钮的唯一标识进行比较,不存在说明没有权限,吧本标签的remove掉就是删除掉,来达到我们控制功能按钮的目的。

2.数据库设计

资源表resources

序号    字段英文    中文    类型    是否为空    是否主键    备注
1    id    唯一ID    int(11)    NO    PRI    
2    code    编码    varchar(255)    YES        
3    murl    菜单URL    varchar(255)    YES        
4    furl    功能URL    varchar(255)    YES        
5    type    资源类型    int(11)    YES        
6    pid    0 系统父级  1功能菜单 其他保存父级ID    int(11)    YES        
7    status    0启用 1停用    int(11)    YES        
8    name    资源名称    varchar(255)    YES        
9    sort    排序号    int(11)    YES        
10    css    CSS样式    varchar(255)    YES        
11    display    是否显示    varchar(255)    YES        

角色表roles

序号    字段英文    中文    类型    是否为空    是否主键    备注
1    id    唯一ID    int(11)    NO    PRI    
2    name    角色名称    varchar(255)    YES        
3    code    角色代码    varchar(255)    YES        
4    cdate    创建时间    datetime    YES        
5    cusers    创建人    varchar(255)    YES        
6    udate    修改时间    datetime    YES        
7    uusers    修改人    varchar(255)    YES               

角色资源关联表rolres      

序号    字段英文    中文    类型    是否为空    是否主键    备注
1    roleid    角色ID    int(11)    YES    MUL    
2    resroucesid    资源ID    int(11)    YES        
3    id    主键    int(255)    NO    PRI    

3.后台实现

自定义注解Vial.java

package com.accp.common;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = { ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Vial {

}

在拦截器中实现拦截coutroller中带有@Vial注解的方法

            Vial methodVial = handlermethod.getMethodAnnotation(Vial.class);
			Vial classVial = handlermethod.getBeanType().getAnnotation(Vial.class);

			// 没有声明权限,放行
			if (null == methodVial && null == classVial) {
				return true;
			}else{
                //验证本用户中是否关联资源中的URL
				if(RoleChecked.RoleChecked(requestUrl)){
					returnAlert(request,response,"无操作权限请联系管理员,确定将返回登录页面重新登录!",1);
					return false;
				}else{
					return true;
				}
			}

4.前台实现

先把用户登陆后的资源权限唯一编码从数据库取出存在页面的隐藏域中。

在引用写的JS验证角色权限的脚本

//功能按钮角色验证的初始化函数
var a;
var init = function(iframId,r_v_data){
	a = r_v_data;
	get_Ifram(iframId);
	
}
var  nodes = [];

var get_Ifram = function(iframId){
	var iframe = document.getElementById(iframId);
	if (iframe.attachEvent) {
	    iframe.attachEvent("onload", function () {
	    	get_R_V(iframe.contentWindow.document);
	    });
	} else {
	    iframe.onload = function () {
	    	get_R_V(iframe.contentWindow.document);
	    };
	}
}

var get_R_V = function(obj){
	dfs(obj.body);
}

function dfs(node) {
	if(node!=null){
	    if(node.nodeType === 1) {
	        var tagName = node.tagName;
	        if(node.getAttribute('R_V') != null){
	        	 if(a.indexOf(node.getAttribute('R_V'))==-1){
	        		 if(isIE()||isIE11()){
	        			 node.removeNode(true); 
	        		 }else{
	        			 node.remove();
	        		 }
	             }
	        }
	        
	        var children = node.childNodes;
	        for(var i = 0, len = children.length; i < len; i++) {
	            dfs(children[i]);
	        }
	    }
	}
}

function isIE(){
	if(!!window.ActiveXObject || "ActiveXObject" in window){
		return true;
	}else{
		return false;
	}
} 
function isIE11(){
	if((/Trident\/7\./).test(navigator.userAgent)){
	   return true;
	}else{
		return false;
	}
}

首页初始化调用初始化函数

//每次页面ifram中的url重新加载就要验证呀功能
function iframSrc(url,id){
	document.getElementById("frame").src =  url;
	init("frame",$("#hidcode").val());
	
}

好了这边只是给大家说个大概的思路具体实现根据思路可以完成,也希望大家能够多多补充哪里不足

你可能感兴趣的:(java)