按钮权限控制1
- 通过拦截器获取前台传入请求参数:类+方法
HandlerMethod methodObj = (HandlerMethod) handler;
String function = methodObj.getBean().getClass().getName() + ":" + methodObj.getMethod().getName();
- 编写权限检查工具类,由拦截器调用具类的检查方法传入获取的请求参数(String function)返回是否具有权限的boolean值。
- 2.1调用PermissionUtils.checkPermission()
boolean flag = PermissionUtils.checkPermission(function);
- 2.2 checkPermission(String function) 权限检查过程:
2.2.1 判断是否为超级管理员,从session中获取当前登录用户是用户的Emlpoyee信息,拥有超级管理员权限直接放行,结束checkPermission(),return true。
2.2.2 检查封装的静态List allPermission集合中是否有内容,如果没有,从数据库中查询所有权限,封装到allPermissions中。
2.2.3 检查传入参数function是否包含在allPermission集合中:
如果不在集合中 该请求参数不需要权限控制,直接放行。
如果在集合中进行下一步判断。
2.2.4 获取用户自身权限集合List userPermission。
检查传入参数function是否包含在userPermission中(完全匹配过程):
如果在集合中该请求拥有对应权限,放行。
如果不在集合中进行进一步的ALL匹配,匹配成功放行,失败拦截。
public static boolean checkPermission(String function)
{
HttpSession session = UserContext.get().getSession();
Employee currnetUserEmployee = (Employee) session.getAttribute(UserContext.USERINSESSION);
if (currnetUserEmployee.getAdmin())
{
// 超级管理员处理
return true;
}
// 拿到function去所有权限中查询,看该权限是否在集合中
// 获取所有权限信息
if (CommonUtils.allPermissions.size() == 0)
{
// 从数据库中查询所有权限,封装到allPermissions中
List<Permission> allPermissions = permissionService.selectAll();
for (Permission p : allPermissions)
{
CommonUtils.allPermissions.add(p.getResource());
}
}
// 判断该表达式是否需要权限控制
if (CommonUtils.allPermissions.contains(function))
{
// 如果有改地址需要进行权限控制
// 先拿到用户权限集合,从Session中获取所有权限集合
List<String> userPermission = (List<String>) UserContext.get().getSession().getAttribute(UserContext.PERMISSIONINSESSION);
// 进行完全匹配
if (userPermission.contains(function))
{
return true;
} else
{
// 进行ALL权限匹配
String allPermissionString = function.split(":")[0] + ":ALL";
if (userPermission.contains(allPermissionString))
{
return true;
} else
{
return false;
}
}
} else
{
// 如果没有,直接放行
return true;
}
}
- 拦截器获得返回拦截结果,进行后续处理。
if (flag)
{
return true;
} else
{
System.out.println("______被拦截________");
// 如果是页面
// 如果是Ajax
if (methodObj.getMethod().isAnnotationPresent(ResponseBody.class))
{
// true代表ajax请求
response.sendRedirect("nopermission.json");
} else
{
response.sendRedirect("nopermission.jsp");
}
return false;
}