权限管理系统

news/2025/2/19 17:15:17/

菜单权限系统

在大学毕业时,写了一个权限管理系统,由于经验不够丰富,所以设计出来的作品,缺点多多。经过一年多的工作,对权限管理系统进行了更加系统的整理与学习,于是重构了整个权限管理系统。该文章主要讨论菜单权限,需要数据权限相关的,可以查看数据权限系统。


设计目标

1.实现按钮,菜单所见即所得。也就是用户看到了按钮A,那么就能够操作按钮A,而不是点击后却提示用户无法操作
2.实现后端对每个用户的访问URL进行控制
比如:比如A用户是普通员工,却尝试hack系统,通过拼接URL的方式来尝试访问系统。防止发生数据泄露与误删除

设计原则

由于权限管理系统,大部分都是基于Role Base Access Control原则,在该设计中也沿用了该原则,然后进行了一些小细节的修改,比如简化分组的授权,简化直接给用户授权等特性。


数据库设计


界面技术选型

由于开发的系统是内部系统,整体使用boostrap框架。其中为了更方便的管理资源,使用ztree组件作为树的管理。


后台技术选型

后台还是采用擅长的spring + spring mvc + mybatis。


设计难点

在权限管理中,数据库的设计并不复杂,所以从技术上而言,难度不大。主要难度在于,如何能够快捷有效的进行授权,以及维护资源权限。为了达到授权与维护的方便,使用了多个尝试,由最开始的jqGrid tree特性,到ztree,再到拖动排序,以及数据库的设计等多次优化


后端实现

在后台,使用Filter对请求进行拦截,如果一个请求,当前用户具备该权限,那么允许访问。
代码逻辑如下
/*** 判断某个用户请求的用户是否有权限访问* 如果无权限,直接返回,提示用户错误信息* 避免用户通过url的方式来攻击程序* @email luohong.lh@alibaba-inc.com*/
public class AuthFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;//根据用户ID获取该用户可以访问的URL列表List<String> authUrls = getAuthUrls(request.getSession().getAttribute('userId')); String uri = request.getRequestURI();if(authUrls.contains(uri)){filterChain.doFilter(servletRequest, servletResponse);}else{System.out.println('sorry,您无权限访问');}}@Overridepublic void destroy() {}
}

注意点:这里面我们只需要对核心的URL拦截即可,比如比如变更数据库数据的URL等。对于一些无需权限控制的URL,直接通过访问即可。比如用户有一个编辑按钮,那么一般就会具备/id.json,以及/update.json两个URL,我们可以考虑只监控/update.json即可。


前端实现

在前端,由于需要实现所见即所得,所以对于没有访问权限的按钮,都需要隐藏起来。为了达到这个设计目标,系统在用户登陆时,会将所有的资源code列表,放回到前端js变量中,然后界面初始化时,根据是否具备权限,来控制按钮的显示与否。

代码逻辑如下

1.从后端获取当前用户可以访问的菜单权限
数据格式如下:['user.add', 'user.delete', 'user.update', 'user.delete', 'user.list']
2.前段渲染按钮时,判断是否具备某个权限,如果具备,那么按钮显示
{hasMenuAuth('user.add') && <button type='button' class='btn primary-btn'>Add</button>
}

小技巧:为了给每个菜单,按钮一个更加合理并且容易记忆的key,可以使用path规则。

规则如下:module1.module2.action

比如:用户管理模块,那么可以使用system.user.add,system.user.delete,system.user.update类似的key规则来组织


菜单管理界面的参考示意图

1.资源管理界面,左侧是菜单,右侧的是菜单关联的权限,以及每个按钮对应的URL,其中菜单允许拖动!!!

2.角色管理界面,左侧是角色列表,右侧是该角色授予的权限列表,这里面勾选时,需要具备级联操作,方便快速授权。



总结

设计一个资源管理系统,其实整体而言,方案还是非常简单的

主要的难点在于如何使得运营效率更高效,系统模型的简洁性与扩展性

1.选择合适的界面排版,使得可以快速拖动菜单,这里面使用的是ztree组件(拖动后需要递归处理关联的所有权限噢,该功能需要一些些编码的小小难度)

2.授权时,级联动作,方便批量授权

3.权限的key规则


后端方面可以考虑后端集成shiro的技术,这方便有兴趣的朋友可以参考下shiro。


http://www.ppmy.cn/news/583186.html

相关文章

Linux系统管理

目录 1.Linux服务管理 2.系统运行级别 3.配置服务开机启动和关闭防火墙 3.1.窗口化配置服务的开机自启 3.2.开机自启命令 3.3开启关闭防火墙 4.关机重启命令 1.Linux服务管理 计算机中&#xff0c;一个正在执行的程序或命令&#xff0c;被叫做“进程”( process)。启动之…

信息管理系统

员工信息管理系统 要求&#xff1a; 输入5个员工的信息&#xff08;输入&#xff09;&#xff0c;每个员工含有成员名为“工号、姓名、基本工资、补贴、奖金、水电费、房租、实发工资、工资排名”&#xff0c;编写函数完成下列要求&#xff1a; (1)输入一个员工的工号&#x…

系统服务管理

一、引导过程及运行级别 1.Linux引导流程总览 2.运行级别的含义及分类 默认包括7种运行级别 −0&#xff1a;关机 −1&#xff1a;单用户模式 −2&#xff1a;字符界面的多用户模式&#xff08;不支持网络&#xff09; −3&#xff1a;字符界面的完整多用户模式 −4&…

Centos系统管理

Centos系统管理 启动设计到的概念 BIOS&#xff1a;–>这个原来很好理解的 Basic Input Output System固话在主板上的制度内存金香果主要提供底层的硬件设置和控制 MBR 硬盘的分区格式&#xff1a; MBR格式GPT格式 MBR格式&#xff1a; 英文名&#xff1a;引导记录扇区…

系统管理简介

系统管理 Linux基础 走进Linux Linux历史 Linux之父&#xff1a;Linus Torvalds林纳斯.托瓦兹1994 年&#xff0c;Torvalds 发布 Linux-v1.01996 年&#xff0c;Torvalds 发布 Linux-v2.0&#xff0c;确定了 Linux 的吉祥物&#xff1a;企鹅 常见Linux发行版 Linux Mint、Ub…

7、系统管理

文章目录 7、系统管理7.1 Linux 中的进程和服务7.2 service 服务管理&#xff08;CentOS 6 版本-了解&#xff09;7.2.1 基本语法7.2.2 经验技巧7.2.3 案例实操&#xff08;1&#xff09;查看网络服务的状态&#xff08;2&#xff09;停止网络服务&#xff08;3&#xff09;启动…

用户管理系统

用户管理系统 一、系统描述 系统分为用户和管理员两大模块。 用户模块有用户界面&#xff0c;用户可以进行登录和注册&#xff0c;登录进入用户界面&#xff0c;可以对个人信息进行修改&#xff0c;可以更改自己的登录密码。 管理员有管理员界面&#xff0c;管理员登录进入…

【Linux】一步一步学Linux——startx命令(199)

00. 目录 文章目录 00. 目录01. 命令概述02. 命令格式03. 常用选项04. 参考示例05. 附录 01. 命令概述 startx命令用来启动X-Window&#xff0c;它负责调用X-Window系统的初始化程序xinit。以完成 X-Window运行所必要的初始化工作&#xff0c;并启动X-Window系统。 02. 命令格…