您的位置:首页 > 其它

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

2016-08-14 13:24 417 查看
最简单的权限验证方式代码:

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的权和来实现.

这样,基本就能实现一个最基本的权限控制.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: