在大学毕业时,写了一个权限管理系统,由于经验不够丰富,所以设计出来的作品,缺点多多。经过一年多的工作,对权限管理系统进行了更加系统的整理与学习,于是重构了整个权限管理系统。该文章主要讨论菜单权限,需要数据权限相关的,可以查看数据权限系统。
/**
* 判断某个用户请求的用户是否有权限访问
* 如果无权限,直接返回,提示用户错误信息
* 避免用户通过url的方式来攻击程序
* @email [email protected]
*/
public class AuthFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
//根据用户ID获取该用户可以访问的URL列表
List authUrls = getAuthUrls(request.getSession().getAttribute('userId'));
String uri = request.getRequestURI();
if(authUrls.contains(uri)){
filterChain.doFilter(servletRequest, servletResponse);
}else{
System.out.println('sorry,您无权限访问');
}
}
@Override
public void destroy() {
}
}
注意点:这里面我们只需要对核心的URL拦截即可,比如比如变更数据库数据的URL等。对于一些无需权限控制的URL,直接通过访问即可。比如用户有一个编辑按钮,那么一般就会具备/id.json,以及/update.json两个URL,我们可以考虑只监控/update.json即可。
代码逻辑如下
1.从后端获取当前用户可以访问的菜单权限
数据格式如下:['user.add', 'user.delete', 'user.update', 'user.delete', 'user.list']
2.前段渲染按钮时,判断是否具备某个权限,如果具备,那么按钮显示
{
hasMenuAuth('user.add') &&
}
小技巧:为了给每个菜单,按钮一个更加合理并且容易记忆的key,可以使用path规则。
规则如下:module1.module2.action
比如:用户管理模块,那么可以使用system.user.add,system.user.delete,system.user.update类似的key规则来组织
2.角色管理界面,左侧是角色列表,右侧是该角色授予的权限列表,这里面勾选时,需要具备级联操作,方便快速授权。
设计一个资源管理系统,其实整体而言,方案还是非常简单的
主要的难点在于如何使得运营效率更高效,系统模型的简洁性与扩展性
1.选择合适的界面排版,使得可以快速拖动菜单,这里面使用的是ztree组件(拖动后需要递归处理关联的所有权限噢,该功能需要一些些编码的小小难度)
2.授权时,级联动作,方便批量授权
3.权限的key规则
后端方面可以考虑后端集成shiro的技术,这方便有兴趣的朋友可以参考下shiro。