网上有很多角色权限验证的框架,这里是小编自己悟的一个思路不知道方便不方便大家伙可以参考一下角色权限的设计思路。(本思路适合ifram嵌套页面和正常跳转页面两种,具体实现是ifram页面的具体实现)
a:首先第一点就是设计数据库:
下面先说说说说涉及到的表吧--
资源表(这里是存放项目资源信息的表,比如说项目的菜单URL,菜单的名称,功能菜单的URL,功能名称,及唯一的标识码)。
角色表(这里是存放用户角色的信息)
资源角色关联表(存放用户角色所关联的资源ID信息)
b:后台的实现思路:
主要验证登陆用户的角色信息的过滤都是放在项目拦截器中,可以自定义一个注解标识controller里面的方法请求之前会验证用户的角色是否包含这个url不包含的就是没有权限操作的模块。
c:前台的实现思路:
前台的作用就是控制隐藏菜单和功能按钮。怎么控制呢--
第一步就是先动态加载出来菜单:用户登陆后第一步就是从后台用户角色信息中吧所有的资源菜单关联出来在前台循环出来菜单。
第二步就是把所有的功能按钮都给获取存到前台JSP或者JS中,然后定义过滤按钮的规则,这边可以自定义标签的中属性R_V,
使用JS获取每个加载的页面所有的标签,在获取自定义的属性R_V标签,当然R_V标签中写的是每个标签在资源表中的唯一标识。
第三步就是使用JS获取R_V标签中的属性值和保存的所有功能按钮的唯一标识进行比较,不存在说明没有权限,吧本标签的remove掉就是删除掉,来达到我们控制功能按钮的目的。
资源表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;
}
}
先把用户登陆后的资源权限唯一编码从数据库取出存在页面的隐藏域中。
在引用写的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());
}
好了这边只是给大家说个大概的思路具体实现根据思路可以完成,也希望大家能够多多补充哪里不足