基于SSM框架的RBAC权限系统设计与 实现

news2024/11/17 21:20:02

基于SSM框架的RBAC权限系统设计与 实现

✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌

🍅文末获取项目下载方式🍅


一、项目背景介绍:

全球信息化加速了信息社会的快速发展,改变了我们的生产方式和生活方式,同时促进了知识经济的快速增长,加快了信息化进程,也作为衡量世界各国发展水平、发展潜力和提高生产力水平、增强综合国力的重要标志。
权限管理系统是公司和组织办公系统的一部分,包括角色增删、权限控制、部门管理以及员工管理等等功能模块。由于它直接与管理整个公司或者组织,员工信息、部门管理等重要信息包含在其中,所以在其构建过程中,系统安全性是最为关键的问题之一。

二、项目技术简介:

  1. JAVA:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
  2. Spring:Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
  3. Mybatis:MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
    iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
  4. Jsp:JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
    JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
  5. Spring-Mvc:Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框。
  6. Html:HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。
    超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。这些相互关联的信息媒体可能在同一文本中,也可能是其他文件,或是地理位置相距遥远的某台计算机上的文件。这种组织信息方式将分布在不同位置的信息资源用随机方式进行连接,为人们查找,检索信息提供方便。

三、系统功能模块介绍:

功能模块图

四、数据库设计:

1:department(department)

字段名类型默认值列注释
idbigint(20)NULL
namevarchar(20)NULL部门名称
snvarchar(20)NULL部门编号

2:employee(employee)

字段名类型默认值列注释
idbigint(20)NULL主键
namevarchar(20)NULL员工名称(登录账号)
passwordvarchar(20)NULL员工密码
emailvarchar(255)NULL员工邮箱
ageint(11)NULL员工年龄
adminbit(1)NULL是否是超级管理员
dept_idbigint(20)NULL关联字段:部门ID

3:permission(permission)

字段名类型默认值列注释
idbigint(20)NULL主键
namevarchar(20)NULL权限名称
expressionvarchar(100)NULL权限表达式

4:role(role)

字段名类型默认值列注释
idbigint(20)NULL角色主键
namevarchar(255)NULL角色名称
snvarchar(255)NULL角色编码

五、功能模块:

  1. 登录功能:系统在第一次启动的时候,因为数据库里面没有员工的数据,所以,应该在系统启动的时候检查数据库,如果是第一次启动,创建一个默认的员工(登录默认的管理员账号为admin,密码为1)。如果输入的账号和密码正确则会转跳到系统的主界面。

    登录功能

  2. 部门模块管理功能:在部门管理模块实现了对部门的基本信息进行管理的操作,如新增一个部门、删除已有的部门、修改现有部门的基础现象、查询以有的部门信息

    部门模块管理功能

  3. 员工模块管理功能:员工管理功能模块可对员工信息进行添加、修改、查询和删除等基础功能。

    员工模块管理功能

  4. 权限模块管理功能:在该模块中进行权限相关数据操作;在系统中,权限主要是用于控制Controller请求的,使用权限表达式映射Controller的方法进行权限控制;要注意系统的权限应该是由系统自动通过扫描Controller上的权限标签数据加载出来的,而不能通过添加手动添加。

    权限模块管理功能

  5. 角色模块管理功能:在该模块中进行角色相关的维护;
    在角色添加模块中,添加角色名称和角色代码,选择属于该角色的权限信息。
    点击添加角色的信息:

    角色模块管理功能

六、代码示例:

登录功能
public void login(String username, String password) {
 //1:通过账号跟密码查询对应员工对象
 Employee emp =
employeeMapper.selectEmployeeByUsernameAndPassword(username, password);
 //2:判断用户是否存在
if(emp == null){
 //3:不存在抛出一个异常
 throw new RuntimeException("账号或密码错误");
 }
UserContext.setCurrentUser(emp);
 //4:查询当前登录用户的所有权限
 List<String> list =
employeeMapper.selectPermissionExpressesByEmployeeId(emp.getId());
 //5.共享权限表达式集合到session
UserContext.setPermissionExps(list);
 }
部门模块管理功能
1)查询部门信息
//查询表单页面中需要的部门信息
model.addAttribute("depts", departmentService.list());
//查询表单页面中需要的角色信息
model.addAttribute("roles", roleService.list());
 return "employee/input";2)部门信息的回显
<select class="form-control" id="dept" name="dept.id">
<c:forEach items="${depts}" var="d">
<option value="${d.id}" ${entity.dept.id==d.id?"selected":""}>
           ${d.name}
</option>
</c:forEach>
</select>
员工模块管理功能
下面是系统进行权限的判断以及拦截的流程:
//:获取当前用户
 Employee emp = UserContext.getCurrentUser();
 //1:判断是否是超级管理员
 if(emp.isAdmin()){
 //是:放行
 return true;
 }
 //2:请求方法是否需要权限检查
 //当前请求方法的处理器
HandlerMethod hm = (HandlerMethod) handler;
 //获取当前请求的方法
 Method method = hm.getMethod();
RequiredPermissionann =
method.getDeclaredAnnotation(RequiredPermission.class);
if(ann == null){
 //不需要权限检查, 直接放行
 return true;
 }
 //3:判断当前用户是否拥有访问当前请求方法权限
 //3.1:获取当前请求方法的权限表达式
 String epr = ann.value()[1];
 //3.2:获取当前用户的所有权限表达式列表
 //思考: 查询登录用户的权限集合应该应该再何处执行
 //位置1: 在SecurityInterceptor查询
//不建议:每次请求都进入拦截, 然后执行sql, 性能比较低, 况且, 用户的权限变化是低频率
 //位置2: 用户登录成功时查询(推荐)
 //优点:查询一次就可以多次使用
 List<String>exps = UserContext.getPermissionExps();
 //3.3:比较当前的方法权限表达式是否在用户权限表达式集合中
 if(exps.contains(epr)){
 return true;
}
权限模块管理功能
    @Override
    public void reload() {
        //1:获取数据库中所有权限表达式
        List<String> pers = permissionMapper.selectPermissions();
        //2:从Spring容器中获取所有的贴有Controller注解的bean
        Map<String, Object> map = ctx.getBeansWithAnnotation(Controller.class);
        Collection<Object> ctrls = map.values();
        for (Object ctrl : ctrls) {
            System.out.println(ctrl);
            //3:获取每个Controller bean的所有方法对象Method
            Method[] methods = ctrl.getClass().getDeclaredMethods();
            for (Method m : methods) {
                //4:获取Controller方法对象上的@RequiredPermission注解对象
                RequiredPermission anno = m.getAnnotation(RequiredPermission.class);
                //5:如果方法上存在权限注解,并且权限注解表达式未存在于数据库中,则将该权限对象插入数据库
                if (anno != null && !pers.contains(anno.value()[1])) {
                    String name = anno.value()[0];
                    String expression = anno.value()[1];
                    Permission p = new Permission(name, expression);
                    // 将该权限对象插入数据库
                    permissionMapper.insert(p);
                }
            }
        }
    }
角色模块管理功能
    @Override
    public void saveOrUpdate(Role role, Long[] ids) {
        if (role != null && role.getId() != null) {
            //更新数据之前,先把role_permission的旧关系删除
            roleMapper.deleteRelation(role.getId());
            roleMapper.updateByPrimaryKey(role);
        } else {
            roleMapper.insert(role);
//            int i = 1/0;
        }
        //维护role表和permission表的关系(role_permission表)
        if (ids != null) {
            for (Long permissionId : ids) {
                roleMapper.insertRelation(role.getId(), permissionId);
            }
        }
    }

    @Override
    public PageBean<Role> queryPageList(QueryObject qo) {
        //查询总记录数
        int count = roleMapper.selectCount(qo);

        if (qo.getCurrentPage() > count || qo.getCurrentPage() <= 0) {
            qo.setCurrentPage(1);
        }
        if (count <= 0) {
            return new PageBean(1, 1, 0, Collections.emptyList());
        }
        //查询分页数据
        List<Role> pageList = roleMapper.selectPageList(qo);
        return new PageBean<Role>(qo.getCurrentPage(), qo.getPageSize(), count, pageList);
    }

七、论文参考:

八、项目总结:

鉴于信息科技的发展,信息管理系统已应用于社会的方方面面,尤其是对于拥有大量信息数据的组织和企业,作用更为突出。但是,随着工作内容的扩大,涉及的信息和人员数量增加,导致维护安全系统的复杂性增加。另外,网络作为最重要的通讯手段,存在着太多的不安全因素,可能会使他人信息泄漏或被人利用。因此,有必要建立一个可靠的权限管理系统,以确保信息系统安全。所以便产生了访问控制技术。
本文首先介绍了RBAC模型的工作原理和概念。在此基础上,介绍了企业管理系统中的管理模块的体系结构设计,其中主要包含部门管理模块、员工管理模块、授权管理模块和角色管理模块。同时,在这些模型的基础上,给出了系统的具体应用。
关键词:权限;角色;RBAC模型;安全性

九、源码获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻

链接点击直达:下载链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络设备驱动框架

1.框架 1&#xff09;网络协议接口层 向网络层协议提供统一的数据包收发接口&#xff0c;不论上层协议是ARP&#xff0c;还是IP&#xff0c;都通过dev_queue_xmit()函数发送数据&#xff0c;并通过netif_rx()函数接收数据。这一层的存在&#xff0c;使得上层协议独立于具体的设…

【总结】vim教程与详细命令总结,该来的躲不掉啊晕

B站|公众号&#xff1a;啥都会一点的研究生 目录写在前面vim的工作模式普通模式编辑模式命令模式命令大全&#xff0c;最详细&#xff08;建议收藏&#xff09;光标的移动插入模式 - 插入/追加文本编辑文本选择文本&#xff08;可视化模式&#xff09;可视化模式命令剪切, 复制…

【Selenium学习】Selenium 中特殊元素操作

1.鼠标定位操作鼠标悬停&#xff0c;即当光标与其名称表示的元素重叠时触发的事件&#xff0c;在 Selenium 中将键盘鼠标操作封装在 Action Chains 类中。Action Chains 类的主要应用场景为单击鼠标、双击鼠标、鼠标拖曳等。部分常用的方法使用分类如下&#xff1a;• click(on…

过滤器与拦截器

文章目录一、前言1、概述2、过滤器与拦截器异同2.1 简介2.2 异同2.3 总结3、Filters vs HandlerInterceptors二、过滤器1、概述2、生命周期2.1 生命周期概述2.2 基于函数回调实现原理3、自定义过滤器两种实现方式3.1 WebFilter注解注册3.2 过滤器&#xff08;配置类注册过滤器&…

vue2vue3常用语法(持续更新)

一、基础1. 指令指令描述v-if判断v-else-if判断后剩下的v-else判断后剩下的v-html渲染html文本格式v-text渲染文本v-for循环v-showdisplay&#xff1a;none/block切换v-model双向绑定v-bind(缩写&#xff1a;:)动态绑定v-on(缩写&#xff1a;)绑定dom事件(如点击事件)v-cloak解…

WMS AMS【Android Framework进阶】

1.简介 可以毫不夸张的说&#xff0c;android的framework层主要是由WMS、AMS还有View所构成&#xff0c;这三个模块穿插交互在整个framework中&#xff0c;掌握了它们之间的关系和每一个逻辑步骤&#xff0c;你对framework的了解至少有百分之五十 AMS是Android中最核心的服务…

设计模式:行为型设计模式

参考文章&#xff1a; 《设计模式》 《设计模式知识体系详解》 《DesignPatterns》 写在开头&#xff1a;本文为学习后的总结&#xff0c;可能有不到位的地方&#xff0c;错误的地方&#xff0c;欢迎各位指正。 前言 行为型模式是将不同的行为代码解耦&#xff0c;从而解决…

疯狂弹出请插入多卷集的最后一张磁盘窗口

整个人嘛了&#xff0c;今天插上U盘&#xff0c;跟tmd中了病毒一样&#xff0c; 屏幕疯狂弹出窗口&#xff0c; 提示请插入多卷集的最后一张磁盘&#xff01; 点确定之后他继续弹出&#xff0c;点取消它也继续弹出&#xff0c; 关掉一个又弹出来一个&#xff0c;妈的&#x…

系统编程中的进程的概念No.3【进程状态】

引言&#xff1a; 北京时间&#xff1a;2023/2/17/8:17&#xff0c;目前听着超能陆战队主题曲《Immortals》&#xff0c;感觉又要螺旋式升天&#xff0c;并且为我今天上午没课感到happy&#xff0c;所以继我们很久以前的关于进程的博客&#xff0c;今天我们就再来学习一下有关…

buuctf Web 下

9.[ACTF2020 新生赛]Exec 访问url&#xff1a; http://cc3c6c27-e2df-4665-baba-1d9a32dc963e.node3.buuoj.cn/ 首页如下&#xff1a; 直接ping ip可以得到结果 常见管道符 1、|&#xff08;就是按位或&#xff09;&#xff0c;直接执行|后面的语句 127.0.0.1 | cat /flag…

html 的相对路径和绝对路径

整篇文章是以 src 标签进行演示。 文章目录 一、相对路径 1、同级目录查找 2、上一级目录查找 3、下一级目录查找 二、绝对路径 一、相对路径 &#x1f475;相对路径&#xff1a;从当前目录开始查找。 1、同级目录查找 写法&#xff1a; 1.1.直接写文件名字&#xff1b;…

Linux之进程控制

一.进程创建 1.1 fork函数 我们创建进程的方式有./xxx和fork()两种 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程…

Echarts实现多柱状图重叠重叠效果

有两种重叠效果: 1. 多个柱子重叠为一个 2. 多个柱子重叠为两组 第一种,图例: 这个灰色不是阴影哦, 是柱子. 1. 使用详解 (1) series.Z 折线图组件的所有图形的 z 值。控制图形的前后顺序。 z 值小的图形会被 z 值大的图形覆盖。z 相比 zlevel 优先级更低&#xff0c;而且不会…

GEE学习笔记 七十三:【GEE之Python版教程七】静态展示影像和动态展示影像

我们使用GEE在线编辑可以直接通过在线的网页可以加载展示我们计算的结果&#xff0c;而python版的GEE要展示我们的计算结果可能就比较麻烦。如果有同学看过GEE的python版API中可以找到一个类ee.mapclient&#xff0c;这个类的介绍是它是GEE官方通过Tk写的一个加载展示地图的类。…

【蓝桥日记⑤】2014第五届省赛(软件类)JavaA组❆答案解析

【蓝桥日记⑤】2014第五届省赛&#xff08;软件类&#xff09;JavaA组☃答案解析 文章目录【蓝桥日记⑤】2014第五届省赛&#xff08;软件类&#xff09;JavaA组☃答案解析1、猜年龄2、李白打酒3、神奇算式4、写日志5、锦标赛6、六角填数7、绳圈8、兰顿蚂蚁9、斐波那契10、波动…

Linux 操作系统原理 — NUMA 体系结构

目录 文章目录 目录NUMA 体系结构NUMA 的基本概念查看 Host 的 NUMA TopologyBash 脚本DPDK 脚步NUMA 体系结构 NUMA(Non-Uniform Memory Access,非一致性存储器访问)的设计理念是将 CPU 和 Main Memory 进行分区自治(Local NUMA node),又可以跨区合作(Remote NUMA nod…

操作系统 三(存储管理)

一、 存储系统的“金字塔”层次结构设计原理&#xff1a;cpu自身运算速度很快。内存、外存的访问速度受到限制各层次存储器的特点&#xff1a;1&#xff09;主存储器&#xff08;主存/内存/可执行存储器&#xff09;保存进程运行时的程序和数据&#xff0c;内存的访问速度远低于…

【信管12.2】知识管理与知识产权

知识管理与知识产权想必你对知识的概念多少都会有一些自己的理解&#xff0c;毕竟我们经过了那么多年的教育&#xff0c;学来学去可不都学习的是“知识”嘛。在今天的学习中&#xff0c;内容还是会比较多&#xff0c;因为除了知识管理相关的内容之外&#xff0c;还有知识产权相…

Matlab 最小二乘法拟合平面(SVD)

文章目录 一、简介1.1最小二乘法拟合平面1.2 SVD角度二、实现代码三、实现效果参考资料一、简介 1.1最小二乘法拟合平面 之前我们使用过最为经典的方式对平面进行了最小二乘拟合(点云最小二乘法拟合平面),其推导过程如下所示: 仔细观察一下可以发现