Java研学-RBAC权限控制(一)

一 权限控制

1 介绍

  RBAC(Role-Based Access Control,基于角色的访问控制)是一种流行的权限控制策略,用于实现复杂系统的安全访问管理。它通过将权限与角色相关联,而不是直接与用户相关联,从而简化了权限管理过程。RBAC是一种强大且灵活的权限控制策略,适用于各种规模的系统和场景。通过合理地配置和管理角色和权限,可以有效地保护系统的安全性和稳定性。

  RBAC的基本思想是将用户划分到不同的角色中,每种角色拥有不同的权限。当用户需要执行某项操作时,系统会根据用户的角色来判断其是否具有相应的权限。这种权限控制方式使得权限管理更加灵活和高效。

  RBAC通常包括以下几个关键组成部分:
    用户(User):系统的使用者,每个用户都被分配一个或多个角色。
    角色(Role):权限的集合,用于描述一组用户在系统中可以执行的操作。
    权限(Permission):对系统中某个特定资源或操作的访问许可。
    会话(Session):用户与系统的交互过程,用于确定用户在某个时间点所拥有的权限。

  RBAC可以根据实际需求进行不同的配置和扩展,主要有以下几种类型:
    基本RBAC(Core RBAC):只包含用户、角色和权限三个基本元素,以及它们之间的基本关系。
    角色层次RBAC(Hierarchical RBAC):在基本RBAC的基础上,引入角色间的继承关系,使得权限管理更加灵活。
    约束RBAC(Constrained RBAC):在RBAC的基础上增加了一些约束条件,例如对角色、权限和用户之间的关系的限制,以防止权限的滥用。
    统一模型RBAC(Unified Model RBAC):结合了角色层次RBAC和约束RBAC的特点,提供了一个统一的框架来管理复杂的权限控制需求。

  RBAC的优势在于:
    简化权限管理:通过将权限与角色关联,而不是直接与用户关联,大大简化了权限的分配和管理过程。
    灵活性:可以根据实际需求灵活配置角色和权限,适应不同的业务场景。
    可扩展性:通过引入角色层次和约束条件,可以方便地扩展RBAC模型以满足更复杂的权限控制需求。

2 RBAC 重要对象

  用户(Employee):角色施加的主体;用户通过拥有某个或多个角色以得到对应的权限。一个用户可以拥有多个角色,一个角色可以分配给多个用户
  角色(Role):表示一组权限的集合。一个角色可以拥有多个权限,一个权限可以分配给多个角色
  权限(Permission):一个资源代表一个权限,是否能访问该资源,就是看是否有该权限。用户和权限没有直接关系

3 流程分析

  系统中的用户信息应是受保护的,登录后,不同职位看到的功能是不同的,不同用户看到的信息也是不同的,假设学习委员的权限不止这些,那么将这些权限一个个赋予给用户就是一件很繁琐的事情(尤其是更换学委后需要重新收回权限在赋予给别人)。角色不等于职位(有时生活委员小黄需要兼职学习委员小绿的活)。应将权限给角色,再将角色给用户,间接的将权限给用户
流程分析

4 数据库表

  基于用户,角色,权限,至少需要5张数据库表,用户表,角色表,权限表,用户角色中间表·,角色权限中间表
  用户与角色应为多对多的关系,角色与权限应为多对多的关系
数据库表

5 小结

  用户从浏览器发起请求,登录后我们会将这个用户存进来,用户的身份信息对应用户角色中间表就会有他对应的角色,在通过角色权限中间表间接拿到他对应的权限,此时他再访问某些控制器方法时,如果他拥有对应的权限,那么他就可以进行访问。
  这个权限判定应该在进入方法之前判定,也就是通过拦截器进行权限判定

二 Bootstrap

1 介绍

  Bootstrap是一个流行的前端框架,由Twitter的开发者创建并维护。它是一套用于开发响应式布局、移动设备优先的WEB项目的工具集。Bootstrap提供了大量的HTML和CSS模板,以及一些可选的JavaScript扩展。这些模板和扩展可以帮助开发者快速构建出常见的网页元素和交互功能,比如导航栏、表格、表单、轮播图等。

  同时,Bootstrap还内置了一些响应式设计的特性,可以确保网页在不同设备上的显示效果都很好。Bootstrap是一个强大而灵活的前端框架,适用于各种规模的WEB项目,可以通过Bootstrap来快速构建出高质量的网页应用。

  可通过下载 Bootstrap 压缩包源码或使用CDN(远程服务器,各地都有,使用它会链接到最近的服务器,直接使用CDN提供的链接即可),也可以通过node进行安装,其中第一种方式下载后没有网络也可以使用,第二种方式必须有网络才能使用。

<!--这是demo-->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
	<!--charset="utf-8":定义文档使用的字符编码为UTF-8,确保中文等字符的正确显示。
	X-UA-Compatible:确保IE浏览器使用最新的渲染模式。
	viewport:设置视口宽度等于设备宽度,并设置初始缩放级别为1,这是实现响应式设计的关键。-->
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>playBootstrap</title>
    <!-- Bootstrap -->
  <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"
        integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
  <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap-theme.min.css"
        integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
  <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
  <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"
          integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<h1>playBootstrap</h1>
<!-- 引入 jQuery (此版本 Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" 
        integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
<!--引入 Bootstrap 的所有 JavaScript 插件-->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" 
        integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</body>
</html>

2 栅格系统

  Bootstrap 提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列(因为他可以被2346整除)。它包含了易于使用的预定义类,还有强大的mixin 用于生成更具语义的布局。此时无论浏览器窗口大小如何变化,格式也随之变化。(可以通过编辑"col-md-1"的数字大小,设置该div占多少列,注意一共12列,不能多)

<!--分列-->
<div class="row">
  <div class="col-md-1" style="background-color: orange">.col-md-1</div>
  <div class="col-md-1" style="background-color: #267e8a">.col-md-2</div>
  <div class="col-md-1" style="background-color: #c99436">.col-md-3</div>
  <div class="col-md-1" style="background-color: rgba(16,101,45,0.39)">.col-md-4</div>
  <div class="col-md-1" style="background-color: #ffa5e6">.col-md-5</div>
  <div class="col-md-1" style="background-color: #ff2000">.col-md-6</div>
  <div class="col-md-1" style="background-color: #171717">.col-md-7</div>
  <div class="col-md-1" style="background-color: #e8d0a4">.col-md-8</div>
  <div class="col-md-1" style="background-color: #7d0f5e">.col-md-9</div>
  <div class="col-md-1" style="background-color: #7b3776">.col-md-10</div>
  <div class="col-md-1" style="background-color: #38a4ad">.col-md-11</div>
  <div class="col-md-1" style="background-color: #f1e237">.col-md-12</div>
</div>
<!--表格-->
<table class="table table-striped table-bordered table-hover table-condensed">
  <tr class="success">
    <td>ID</td>
    <td>姓名</td>
    <td>部门</td>
  </tr>
  <tr class="warning">
    <td>1</td>
    <td>大黄</td>
    <td>BA</td>
  </tr>
  <tr>
    <td>2</td>
    <td class="danger">小黄</td>
    <td>DEV</td>
  </tr>
</table>
<!--表单-->
<form>
  <div class="form-group">
    <label for="address">address</label>
    <input type="email" class="form-control" id="address" placeholder="address">
  </div>
  <div class="form-group">
    <label for="Password">Password</label>
    <input type="password" class="form-control" id="Password" placeholder="Password">
  </div>
  <div class="checkbox">
    <label>
      <input type="checkbox"> 单选框
    </label>
  </div>
  <button type="submit" class="btn btn-default">提交</button>
  <input type="button" value="按钮1" class="btn btn-danger btn-lg">
  <button class="btn btn-success">按钮2</button>
  <a href="#" class="btn btn-warning btn-sm">按钮3</a>
</form>
<!--组件 字体图标-->
<input type="text">
<button class="btn btn-success">
  <span class="glyphicon glyphicon-search" 
        aria-hidden="true" style="color: #ffa5e6;font-size: 50px"></span>
</button>
<!--模态框 提交表单-->
<div class="modal fade" tabindex="-1" role="dialog" id="myModal">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
                </button>
                <h4 class="modal-title">部门新增</h4>
            </div>
            <form>
            <div class="modal-body">
                    <div class="form-group">
                        <label for="address">部门名称</label>
                        <input type="text" class="form-control" id="address" placeholder="部门名称">
                    </div>
                    <div class="form-group">
                        <label for="Password">部门缩写</label>
                        <input type="text" class="form-control" id="Password" placeholder="部门缩写">
                    </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                <button type="submit" class="btn btn-primary">保存</button>
            </div>
            </form>
        </div>
    </div>
</div>
<!--双标签默认submit(提交表单)-->
<button id="myBtn">弹框</button>
<script>
    $('#myBtn').click(function (){
        $('#myModal').modal('show')
    })
</script>

3 AdminLTE

  AdminLTE是一个开源的后台控制面板和仪表盘WebApp模板,它建立在Bootstrap和jQuery之上。AdminLTE提供了一系列响应式的、可重复使用的组件,并内置了多个模板页面,如仪表盘、邮箱、日历、锁屏、登录及注册、404错误、500错误等。这使得开发者可以快速地创建一个响应式的Html5网站。AdminLTE的特点包括易用性(代码结构清晰,易于理解和自定义)、高度可扩展性(可以添加或移除任何组件以适应不同的项目需求)、社区活跃(拥有活跃的社区支持,不断更新维护,问题解答及时)、多语言支持(内置多语言包,满足国际化需求)以及完全免费(遵循MIT许可证,可以自由使用和修改)。对于前端架构设计师来说,使用AdminLTE不仅能美化网页,还能大大减轻编写CSS和JS的工作量。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《QT实用小工具·二十三》 Ntp校时类

1、概述 源码放在文章末尾 该项目实现了 Ntp校时类 &#xff0c;包含如下功能&#xff1a; 可设置Ntp服务器IP地址。 推荐用默认的阿里云时间服务器 ntp1.aliyun.com 收到时间信号发出。 时间精确到秒。 下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #if…

组态王与美国罗克韦尔AB PLC之间无线通讯方案详解

组态王与多台美国罗克韦尔AB PLC间的无线通信测试需要用到以下设备&#xff1a; 三菱PLC型号&#xff1a;FX5u 2台 上位机&#xff1a;组态王6.55 1台 达泰欧美系PLC无线通讯终端——DTD418MB 3块 主从关系&#xff1a;1主2从 通讯接口&#xff1a;RJ45接口 供电&…

传统前端 JS 开发者有福了

大家好&#xff0c;春天的百花绽放之际&#xff0c;各个行业也迎来了各自的新生与挑战。有的继续沉下心来夯实基础&#xff0c;有的大力发展出海业务&#xff0c;又或者通过顶级促销套路天女散花般地贩卖高仿保时捷……这厢 Mendix 各位技术小伙伴继续紧跟时代脉搏&#xff0c;…

【linux】拓展知识-linux图形界面(GUI 程序)、X11介绍

linux图形界面 Linux 本身是没有图形化界面的&#xff0c;linux只是一个基于命令行的操作系统&#xff0c;所谓的图形化界面系统只不过中 Linux 下的应用程序。没有图形界面linux还是linux&#xff0c;很多装linux的WEB服务器就根本不装X服务器。 这一点和 Windows 不一样。W…

制作一个RISC-V的操作系统十-Trap和Exception(流 mtvec mepc mcause mtval mstatus trap完整流程)

文章目录 流mtvecmepcmcausemtvalmstatustrap 初始化trap的top half&#xff08;硬件完成&#xff09;trap的bottom half&#xff08;软件完成&#xff09;从trap返回代码实现 流 控制流&#xff1a;程序控制的执行流 trap分为中断和异常 mtvec base&#xff1a;存储trap入…

python|sort_values()排序

sort_value()可以用来对值&#xff08;比如说年龄&#xff09;进行排序 根据 ‘Age’ 列进行升序排序&#xff0c;如果 ‘Age’ 相同则根据 ‘Name’ 列进行降序排序 df_sorted_multi df.sort_values(by[Age, Name], ascending[True, False]) print(df_sorted_multi)

如何在WHM面板上更改主机名

本周有一个客户&#xff0c;购买Hostease的独立服务器并选择了WHM控制面板&#xff0c;询问我们的在线客服&#xff0c;如何在WHM面板上更改主机名。我们为用户提供教程&#xff0c;用户很快完成了设置。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您有帮助。…

SpringBoot内容协商快速入门Demo

1.什么内容协商 简单说就是服务提供方根据客户端所支持的格式来返回对应的报文&#xff0c;在 Spring 中&#xff0c;REST API 基本上都是以 json 格式进行返回&#xff0c;而如果需要一个接口即支持 json&#xff0c;又支持其他格式&#xff0c;开发和维护多套代码显然是不合理…

超图SuperMap-Cesium,地形图层,可以渲染一个或多个地形(地形可缓存DEM,TIN方式),webGL代码开发(2024-04-08)

1、缓存文件类型TIN格式&#xff0c;TIN的地形sct只能加一个 const viewer new Cesium.Viewer(cesiumContainer); viewer.terrainProvider new Cesium.CesiumTerrainProvider({isSct: true, // 是否为iServer发布的TIN地形服务,stk地形设置为falserequestWaterMask : true,…

代理IP在爬虫中的连接复用与开销减少

目录 一、引言 二、代理IP的基本概念 三、代理IP在爬虫中的使用 四、代理IP的连接复用 五、减少开销的策略 六、代码示例与注释 七、总结 一、引言 在爬虫开发中&#xff0c;代理IP的使用是常见的做法&#xff0c;尤其在目标网站设置了反爬虫机制时。代理IP能够帮助爬虫…

小狐狸转账失败,提示gas费过高

做web3开发的时候&#xff0c;明明自己小狐狸里还有2.15的代币&#xff0c;但页面我要转出2.1的时候&#xff0c;明明是够的&#xff0c;而且使用小狐狸提示gas费用是21000&#xff0c;这已经是最小的了&#xff0c;但网页转出到其他账户总是提示失败。而且这个错误非常不好捕获…

二手车的一些经验

买辆二手车是怎样一种体验&#xff1f; - 知乎 买辆二手车是怎样一种体验&#xff1f; - 知乎 作者&#xff1a;jingangdaddy 链接&#xff1a;https://www.zhihu.com/question/28827207/answer/2881156930 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授…

c++调python接口

1. 新建run.py文件&#xff0c;并定义相关接口&#xff1a; import numpy as np from scipy.fftpack import fftdef str_add(str1,str2):return int(str1) int(str2)def my_sort(data):data.sort()return datadef aw_fft(data, Fs):N len(data)result np.abs(fft(xdata, n…

HarmonyOS 开发-自定义视图实现Tab效果

介绍 本示例介绍使用Text、List等组件&#xff0c;添加点击事件onclick,动画&#xff0c;animationTo实现自定义Tab效果。 效果预览图 使用说明 点击页签进行切换&#xff0c;选中态页签字体放大加粗&#xff0c;颜色由灰变黑&#xff0c;起到强调作用&#xff0c;同时&…

【C++入门】内联函数、auto与基于范围的for循环

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

非线性滤波相位解缠算法

相位解缠是InSAR数据处理流程中较为关键的步骤&#xff0c;同时也是地表高程模型重建 过程中的主要误差来源之一。迄今为止&#xff0c;针对干涉图的相位解缠问题&#xff0c;已经提出了各 种各样的相位解缠算法&#xff0c;这些算法大致可以分为以下几类&#xff1a;①路径跟踪…

nexus搭建maven与docker镜像的私有仓库

引言 通过nexus搭建maven与docker镜像的私有仓库,实现jar包与镜像动态更新、共享、存储。 一、nexus部署 通过docker-compose部署nexus name: java services:#############################环境#############################env-nexus:restart: always## 3.58.1image: so…

SpringBoot自动装配原理之@Import注解解析

文章目录 1. 概述2. 使用2.1 导入普通Bean2.2 导入配置类2.3 导入 ImportSelector 实现类2.4 导入 ImportBeanDefinitionRegistrar 实现类 3. 区别 1. 概述 当谈及现代Java开发领域中的框架选择时&#xff0c;SpringBoot无疑是无与伦比的热门之选。其简化了开发流程&#xff0…

即插即用篇 | YOLOv5/v7引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

本改进已集成到 YOLOv5-Magic 框架。 下采样操作如最大池化或步幅卷积在卷积神经网络(CNNs)中被广泛应用,用于聚合局部特征、扩大感受野并减少计算负担。然而,对于语义分割任务,对局部邻域的特征进行池化可能导致重要的空间信息丢失,这有助于逐像素预测。为了解决这个问题…

动态规划刷题(2)之杨辉三角(详细解释)

最近在自学动态规划,网上到处找资料学习: 在这里记录我的刷题历史: 题目都是在力扣里面刷的!! 这里,我放一个刷动态规划的链接在这里:动态规划知识点题库 - 力扣(LeetCode) 力扣 在这里附加动态规划相关知识点:动态规划(DP)-CSDN博客文章浏览阅读197次。动态规划…