一级a做爰电影免费观看网站/河南百度推广代理商
基于SSM框架的RBAC权限系统设计与 实现
✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌
🍅文末获取项目下载方式🍅
一、项目背景介绍:
全球信息化加速了信息社会的快速发展,改变了我们的生产方式和生活方式,同时促进了知识经济的快速增长,加快了信息化进程,也作为衡量世界各国发展水平、发展潜力和提高生产力水平、增强综合国力的重要标志。
权限管理系统是公司和组织办公系统的一部分,包括角色增删、权限控制、部门管理以及员工管理等等功能模块。由于它直接与管理整个公司或者组织,员工信息、部门管理等重要信息包含在其中,所以在其构建过程中,系统安全性是最为关键的问题之一。
二、项目技术简介:
- JAVA:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
- 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。
- 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)。 - 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编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。 - Spring-Mvc:Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框。
- Html:HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。
超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。这些相互关联的信息媒体可能在同一文本中,也可能是其他文件,或是地理位置相距遥远的某台计算机上的文件。这种组织信息方式将分布在不同位置的信息资源用随机方式进行连接,为人们查找,检索信息提供方便。
三、系统功能模块介绍:
四、数据库设计:
1:department(department)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint(20) | NULL | |
name | varchar(20) | NULL | 部门名称 |
sn | varchar(20) | NULL | 部门编号 |
2:employee(employee)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint(20) | NULL | 主键 |
name | varchar(20) | NULL | 员工名称(登录账号) |
password | varchar(20) | NULL | 员工密码 |
varchar(255) | NULL | 员工邮箱 | |
age | int(11) | NULL | 员工年龄 |
admin | bit(1) | NULL | 是否是超级管理员 |
dept_id | bigint(20) | NULL | 关联字段:部门ID |
3:permission(permission)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint(20) | NULL | 主键 |
name | varchar(20) | NULL | 权限名称 |
expression | varchar(100) | NULL | 权限表达式 |
4:role(role)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | bigint(20) | NULL | 角色主键 |
name | varchar(255) | NULL | 角色名称 |
sn | varchar(255) | NULL | 角色编码 |
五、功能模块:
-
登录功能:系统在第一次启动的时候,因为数据库里面没有员工的数据,所以,应该在系统启动的时候检查数据库,如果是第一次启动,创建一个默认的员工(登录默认的管理员账号为admin,密码为1)。如果输入的账号和密码正确则会转跳到系统的主界面。
-
部门模块管理功能:在部门管理模块实现了对部门的基本信息进行管理的操作,如新增一个部门、删除已有的部门、修改现有部门的基础现象、查询以有的部门信息
-
员工模块管理功能:员工管理功能模块可对员工信息进行添加、修改、查询和删除等基础功能。
-
权限模块管理功能:在该模块中进行权限相关数据操作;在系统中,权限主要是用于控制Controller请求的,使用权限表达式映射Controller的方法进行权限控制;要注意系统的权限应该是由系统自动通过扫描Controller上的权限标签数据加载出来的,而不能通过添加手动添加。
-
角色模块管理功能:在该模块中进行角色相关的维护;
在角色添加模块中,添加角色名称和角色代码,选择属于该角色的权限信息。
点击添加角色的信息:
六、代码示例:
登录功能
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;
}
权限模块管理功能
@Overridepublic void reload() {//1:获取数据库中所有权限表达式List<String> pers = permissionMapper.selectPermissions();//2:从Spring容器中获取所有的贴有Controller注解的beanMap<String, Object> map = ctx.getBeansWithAnnotation(Controller.class);Collection<Object> ctrls = map.values();for (Object ctrl : ctrls) {System.out.println(ctrl);//3:获取每个Controller bean的所有方法对象MethodMethod[] 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);}}}}
角色模块管理功能
@Overridepublic 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);}}}@Overridepublic 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模型;安全性
九、源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻
链接点击直达:下载链接
相关文章:

基于SSM框架的RBAC权限系统设计与 实现
基于SSM框架的RBAC权限系统设计与 实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景…...

目标检测各常见评价指标详解
注:本文仅供学习,未经同意请勿转载 说明:该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在:待上传 目录 常见的评价指标 准确率 (Accuracy) 混淆矩阵 (Confusion Matrixÿ…...

深入讲解Kubernetes架构-控制器
在机器人技术和自动化领域,控制回路(Control Loop)是一个非终止回路,用于调节系统状态。这是一个控制环的例子:房间里的温度自动调节器。当你设置了温度,告诉了温度自动调节器你的期望状态(Desi…...

Urho3D本地化 国际化
本地化子系统提供了创建多语言应用程序的简单方法。 初始化 在使用子系统之前,需要加载本地化字符串集合。通常的做法是在应用程序启动时执行此操作。可以加载多个集合文件,每个集合文件只能定义一种或多种语言。例如: Localization* l10n…...

千锋教育嵌入式物联网教程之系统编程篇学习-04
目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember() sigaddset() sigdelset() 代码讲解 信号阻塞集 sigprocmask() alarm函数 相当于一个闹钟,默认动作是终止调用alarm函数的进…...

【运维】什么是 DevOps?
文章目录什么是 DevOps?如何实现 DevOpsDevOps工作原理: DevOps生命周期DevOps 文化DevOps 工具:构建 DevOps 工具链DevOps 和云原生开发什么是 DevSecOps?DevOps 和站点可靠性工程 (SRE)什么是 DevOps? DevOps 通过结…...

【C++入门】引用、内联函数、auto关键字、基于范围的for循环(C++11)、指针空值nullptr(C++11)
文章目录引用引用概念引用特性引用使用场景常引用内联函数宏的优缺点?C有哪些技术替代宏?auto关键字auto不能推导的场景基于范围的for循环(C11)指针空值nullptr(C11)引用 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名&…...

《FPGA学习》->多个按键控制LED灯
🍎与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。本次项目任务,利用开发板上的4个按键KEY1,KEY2,KEY3,KEY4和2个LED灯LED1&…...

vb.net计算之.net core基础(4)-项目与程序结构(2)
目录 Namespace 语句Visual Basic 中的命名空间完全限定名命名空间可以定义什么全局关键字命名规范条件编译拆分和合并语句拆分成多行在同一行上放置多个语句为代码行添加标签注释串联成员访问运算符点运算符 `.`感叹号 `!`运算符Me 关键字MyMyBaseMyClassNamespace 语句 <…...

基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)
我们通常情况下,芯片进入uboot后,会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键,即可退出autoboot,进入uboot的命令行模式。 官方提供的uboot源码中,为了防止调试串口干扰导致不能进入系统,…...

Lumerical---在FDTD和MODE工程中的PML边界条件
Lumerical---在FDTD和MODE工程中的PML边界条件 引言PML边界条件实现原理PML 类型PML 配置文件PML 配置文件选项Standard(标准)Stabilized(稳定性)Steep AngleCustom(陡角)对于不同的边界使用不同的配置FDE,varFDTD和FDTD SolverPML 参数阅读这篇前,推荐阅读边界条件综述…...

论文投稿指南——中文核心期刊推荐(社会学)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...

KVM-4、KVM 高级功能详解
1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x 、AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高的;在有 Intel EPT 特性支持的平台上,内存虚拟化的效率也较高。 QEMU/KVM 提供了全虚拟化环境,可以让客户机不经…...

【Linux】进程状态
文章目录1. 阻塞1. 举例2. 为什么要阻塞?3.操作系统层面上如何理解进程等待某种资源就绪呢?资源进程4. 总结2.挂起3.Linux进程状态1. R状态进程只要是R状态,就一定是在CPU运行吗?证明当前进程运行状态生成程序查看进程2. S休眠状态…...

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书
2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固(200分) A-1&…...

pygame8 扫雷游戏
一、游戏规则: 1、点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利 2、如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷 二、游戏主逻辑: 主要逻辑即调用run_game, 然后循环检测事件…...

c/c++开发,无可避免的模板编程实践(篇四)
一、容器与模板 前文就说到,标准库基于模板编程,定义了许多容器类以及一系列泛型算法,使程序员可以更简洁、抽象和有效地编写程序。C标准库中有大量的标准容器,这些容器通常包含一组数据或对象的集合,几乎可以和任何类…...

c++11 标准模板(STL)(std::unordered_set)(二)
定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

GEE学习笔记 七十二:【GEE之Python版教程六】命令行简介
这篇开始就要讲解GEE相关的内容,首先聊一下命令行的内容,这个在官方文档中有详细的介绍,这里我简单说一下常用的几个命令,剩余的大家在使用过程中如果又需要可以随时查看相关官方文档的介绍。官方文档地址:https://dev…...

DDD单根 聚合根 实体 值对象
前言2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD。快二十年的时间,领域驱动设计在不断地发展,后微服务时代强调的东西,在国…...

SpringMvc介绍。
目录 1、SpringMvc概述 1、基本介绍 2、工作流程 3、bean加载控制 二、请求 1、请求映射路径 2、请求方式 3、请求参数 4、请求参数(传递json数据) 5、日期类型参数传递 三、响应 四、REST风格 1、REST简介 2、RESTful入门案例 3、RESTfu…...

华为OD机试 - 最小传递延迟(JS)
最小传递延迟 题目 通讯网络中有N个网络节点 用1 ~ N进行标识 网络通过一个有向无环图进行表示 其中图的边的值,表示节点之间的消息传递延迟 现给定相连节点之间的延时列表times[i]={u,v,w} 其中u表示源节点,v表示目的节点,w表示u和v之间的消息传递延时 请计算给定源节点到…...

学生信息管理系统(通讯录)----------通俗易懂、附源码、C语言实现
绪论: 本篇文章使结构体章节后的习题,如果你对C语言有问题,或者结构体有什么问题不妨看看我之前所写的文章(章回体),对于文件管理和内存分配问题我将在后面补上,对于这个学生信息管理系统我用了多种方法和…...

Python抽奖系统
#免费源码见文末公众号# 抽奖系统① def choujiang1():def write():with open(d:\\抽奖系统\\抽奖1.1.pickle,rb) as file:lst1pickle.load(file)namevar1.get()if name not in lst1 and name!录入成功! and name!录入失败! and name!:lst1.append(name)…...

真实景观渲染技巧【Three.js】
受到一些很棒的 three.js 演示、与 covid 相关的旅行禁令以及可能在 pinterest 上花太多时间看美丽的旅行照片的启发——我开始看看我是否可以使用 three.js 和r3f在浏览器中渲染一个令人信服的风景场景。 推荐:将 NSDT场景编辑器 加入你的3D开发工具链。 在过去一个…...

MySQL知识汇总:MySQL函数CASE WHEN用法详解
Case When的两种简单用法 用法一: CASE seasonWHEN Spring THEN 春天 WHEN Summer THEN 夏天 WHEN autumn THEN 秋天 else 冬天 end 用法二: CASE WHEN season Spring THEN 春天WHEN season Summer THEN 夏天WHEN season autumn THEN 秋天 els…...

Python学习-----模块1.0(模块的简介、定义与使用)
目录 前言: 1.什么是模块 2.模块的分类 (1)内置模块 (2)第三方模块 (3)自定义模块 3.模块的使用 4.自定义模块 5.模块和执行文件的判断 前言: 今天就开始讲Python中的模块篇…...

Linux进程学习【二】
✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

我问chatGPT,在JavaScript中构造函数和类的区别
问:构造器函数和面向中的类是同样的东西吗|? 答:构造器函数和面向对象中的类并不是同样的东西,它们之间有些许不同。 在面向对象编程中,类是一种抽象的概念,它描述了一类具有相同属性和行为的对象。类可以…...

软考高级-信息系统管理师之沟通管理(最新版)
项目沟通管理 1、项目沟通管理基础项目沟通管理的重要性项目沟通管理相关理论2、规划沟通管理3、管理沟通4、控制沟通项目沟通管理的技术和工具1、项目沟通管理基础 项目沟通管理的重要性 1、与1T项目成功有关的最重要的四个因素是:主管层的支持、用户参与、有经验的项目经理…...