厦门建站公司哪家好,做一个网站页面多少钱,如何查看网站推广做的好,域名交易1、权限控制 如果没有权限控制#xff0c;系统的功能完全不设防#xff0c;全部暴露在所有用户面前。用户登录以后可以使用系统中的所有功能。这是实际运行中不能接受的#xff0c;所以权限控制系统的目标就是管理用户行为#xff0c;保护系统功能。
1.1、 定义资源 资源就…1、权限控制 如果没有权限控制系统的功能完全不设防全部暴露在所有用户面前。用户登录以后可以使用系统中的所有功能。这是实际运行中不能接受的所以权限控制系统的目标就是管理用户行为保护系统功能。
1.1、 定义资源 资源就是系统中需要保护起来的功能。具体形式很多URL 地址、controller方法、service 方法、页面元素等等都可以定义为资源使用权限控制系统保护起来。
1.2、 创建权限 一个功能复杂的项目会包含很多具体资源成千上万都有可能。这么多资源逐个进行操作太麻烦了。为了简化操作可以将相关的几个资源封装到一起打包成一个“权限”同时分配给有需要的人。
1.3、 创建角色 对于一个庞大系统来说一方面需要保护的资源非常多另一方面操作系统的人也非常多。把资源打包为权限是对操作的简化同样把用户划分为不同角色也是对操作的简化。否则直接针对一个个用户进行管理就会很繁琐。所以角色就是用户的分组、分类。先给角色分配权限然后再把角色分配给用户用户以这个角色的身份操作系统就享有角色对应的权限了。
1.4 管理用户 系统中的用户其实是人操作系统时用来登录系统的账号、密码。
1.5、 建立关联关系
权限→资源单向多对多 Java 类之间单向从权限实体类可以获取到资源对象的集合但是通过资源获取不到权限 数据库表之间多对多 一个权限可以包含多个资源 一个资源可以被分配给多个不同权限
角色→权限单向多对多 Java 类之间单向从角色实体类可以获取到权限对象的集合但是通过权限获取不到角色 数据库表之间多对多 一个角色可以包含多个权限 一个权限可以被分配给多个不同角色
用户→角色双向多对多 Java 类之间双向可以通过用户获取它具备的角色也可以看一个角色下包含哪些用户 数据库表之间 一个角色可以包含多个用户 一个用户可以身兼数职
2、RBAC 权限模型
2.1 概念 鉴于权限控制的核心是用户通过角色与权限进行关联所以前面描述的权限控制系统可以提炼为一个模型RBACRole-Based Access Control基于角色的访问控制。在 RBAC 模型中一个用户可以对应多个角色一个角色拥有多个权限权限具体定义用户可以做哪些事情。
2.2.1 RBAC0 最基本的 RBAC 模型RBAC 模型的核心部分后面三种升级版 RBAC 模型也都是建立在 RBAC0 的基础上。
2.2.2 RBAC1 在 RBAC0 的基础上增加了角色之间的继承关系。角色 A 继承角色 B 之后将具备 B 的权限再增加自己独有的其他权限。比如付费会员角色继承普通会员角色那么付费会员除了普通会员的权限外还具备浏览付费内容的权限
2.2.3 RBAC2 在 RBAC0 的基础上进一步增加了角色责任分离关系。责任分离关系包含静态责任分离和动态责任分离两部分。 静态责任分离给用户分配角色时生效 互斥角色权限上相互制约的两个或多个角色就是互斥角色。用户只能被分配到一组互斥角色中的一个角色。例如一个用户不能既有会计师角色又有审计师角色。 基数约束 一个角色对应的访问权限数量应该是受限的 一个角色中用户的数量应该是受限的 一个用户拥有的角色数量应该是受限的 先决条件角色用户想拥有 A 角色就必须先拥有 B 角色从而保证用户拥有 X 权限的前提是拥有 Y 权限。 动态责任分离用户登录系统时生效 一个用户身兼数职在特定场景下激活特定角色
2.2.4 RBAC3 RBAC3 是在 RBAC0 的基础上同时添加 RBAC2 和 RBAC3 的约束最全面、最复杂
3、角色维护
3.1、创建角色表
/*Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 80034Source Host : localhost:3306Source Schema : project_crowdTarget Server Type : MySQLTarget Server Version : 80034File Encoding : 65001Date: 01/11/2023 11:36:13
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS 0;-- ----------------------------
-- Table structure for t_role
-- ----------------------------
DROP TABLE IF EXISTS t_role;
CREATE TABLE t_role (id int NOT NULL AUTO_INCREMENT,name char(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,PRIMARY KEY (id) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci ROW_FORMAT Dynamic;SET FOREIGN_KEY_CHECKS 1;
3.2、使用插件逆向工程
这个就不说啦
3.3、分页查询
3.3.1、关键字查询
展示 div classtable-responsivetable classtable table-borderedtheadtrth width30input typecheckbox/thth width50编号/thth名称/thth width100操作/th/tr/theadtbody idrolePageBody/tbodytfoottrtd colspan6 aligncenterdiv idPagination classpagination!-- 这里显示分页 --/div/td/tr/tfoot/table
/div
js
// 声明专门的函数显示确认模态框
function showConfirmModal(roleArray) {// 打开模态框$(#confirmModal).modal(show);// 清除旧的数据$(#roleNameDiv).empty();// 在全局变量范围创建数组用来存放角色idwindow.roleIdArray [];// 遍历roleArray数组for(var i 0; i roleArray.length; i) {var role roleArray[i];var roleName role.roleName;$(#roleNameDiv).append(roleNamebr/);var roleId role.roleId;// 调用数组对象的push()方法存入新元素window.roleIdArray.push(roleId);}}// 执行分页生成页面效果任何时候调用这个函数都会重新加载页面
function generatePage() {// 1.获取分页数据var pageInfo getPageInfoRemote();// 2.填充表格fillTableBody(pageInfo);}// 远程访问服务器端程序获取pageInfo数据
function getPageInfoRemote() {// 调用$.ajax()函数发送请求并接受$.ajax()函数的返回值var ajaxResult $.ajax({url: role/get/page/info.json,type:post,data: {pageNum: window.pageNum,pageSize: window.pageSize,keyword: window.keyword},async:false,dataType:json});console.log(ajaxResult);// 判断当前响应状态码是否为200var statusCode ajaxResult.status;// 如果当前响应状态码不是200说明发生了错误或其他意外情况显示提示消息让当前函数停止执行if(statusCode ! 200) {layer.msg(失败响应状态码statusCode 说明信息ajaxResult.statusText);return null;}// 如果响应状态码是200说明请求处理成功获取pageInfovar resultEntity ajaxResult.responseJSON;// 从resultEntity中获取result属性var result resultEntity.result;// 判断result是否成功if(result FAILED) {layer.msg(resultEntity.message);return null;}// 确认result为成功后获取pageInfovar pageInfo resultEntity.data;// 返回pageInforeturn pageInfo;
}// 填充表格
function fillTableBody(pageInfo) {// 清除tbody中的旧的内容$(#rolePageBody).empty();// 这里清空是为了让没有搜索结果时不显示页码导航条$(#Pagination).empty();// 判断pageInfo对象是否有效if(pageInfo null || pageInfo undefined || pageInfo.list null || pageInfo.list.length 0) {$(#rolePageBody).append(trtd colspan4 aligncenter抱歉没有查询到您搜索的数据/td/tr);return ;}// 使用pageInfo的list属性填充tbodyfor(var i 0; i pageInfo.list.length; i) {var role pageInfo.list[i];var roleId role.id;var roleName role.name;var checkboxTd tdinput idroleId classitemBox typecheckbox/td;var numberTd td(i1)/td;var roleNameTd tdroleName/td;var checkBtn button typebutton classbtn btn-success btn-xsi class glyphicon glyphicon-check/i/button;// 通过button标签的id属性别的属性其实也可以把roleId值传递到button按钮的单击响应函数中在单击响应函数中使用this.idvar pencilBtn button idroleId typebutton classbtn btn-primary btn-xs pencilBtni class glyphicon glyphicon-pencil/i/button;// 通过button标签的id属性别的属性其实也可以把roleId值传递到button按钮的单击响应函数中在单击响应函数中使用this.idvar removeBtn button idroleId typebutton classbtn btn-danger btn-xs removeBtni class glyphicon glyphicon-remove/i/button;var buttonTd tdcheckBtn pencilBtn removeBtn/td;var tr trnumberTdcheckboxTdroleNameTdbuttonTd/tr;$(#rolePageBody).append(tr);}// 生成分页导航条generateNavigator(pageInfo);
}// 生成分页页码导航条
function generateNavigator(pageInfo) {// 获取总记录数var totalRecord pageInfo.total;// 声明相关属性var properties {num_edge_entries: 3,num_display_entries: 5,callback: paginationCallBack,items_per_page: pageInfo.pageSize,current_page: pageInfo.pageNum - 1,prev_text: 上一页,next_text: 下一页}// 调用pagination()函数$(#Pagination).pagination(totalRecord, properties);
}// 翻页时的回调函数
function paginationCallBack(pageIndex, jQuery) {// 修改window对象的pageNum属性window.pageNum pageIndex 1;// 调用分页函数generatePage();// 取消页码超链接的默认行为return false;}
展示调用的分页函数 $(function () {//初始化数据window.pageNum 1;window.pageSize 5;window.keyword ;//调用分页函数generatePage();$(#searchBtn).click(function () {//获取关键字数据window.keyword $(#keywordInput).val();//调用函数generatePage();});})
3.3.2、添加角色
创建模态框jsp默认是放在最后的位置
% page contentTypetext/html;charsetUTF-8 languagejava %
!DOCTYPE html
html langzh-CN
div idaddModal classmodal fade tabindex-1 roledialogdiv classmodal-dialog roledocumentdiv classmodal-contentdiv classmodal-headerbutton typebutton classclose data-dismissmodal aria-labelClosespan aria-hiddentruetimes;/span/buttonh4 classmodal-title创筹网系统弹窗/h4/divdiv classmodal-bodyform classform-signin roleformdiv classform-group has-success has-feedbackinputtypetext nameroleNameclassform-control idinputSuccess4 placeholder请输入角色名称 autofocus/div/form/divdiv classmodal-footerbutton idsaveRoleBtn typebutton classbtn btn-primary 保存/button/div/div/div
/div
点击添加展示模态框
//点击添加打开模态框$(#showAddModalBtn).click(function () {$(#addModal).modal(show);});
前端操作:
//获取模态框中的数据然后发送请求$(#saveRoleBtn).click(function () {let roleName $.trim($(#addModal [nameroleName]).val());// 发送异步请求$.ajax({url: role/save.json,type: post,data: {name: roleName},dataType:json,success:function (response) {let result response.result;if (resultSUCCESS){layer.msg(操作成功);//重新加载分页window.pageNum999999;generatePage();}if (resultFAILED){layer.msg(操作失败response.message)}},error:function (response) {layer.msg(response.status response.statusText)}});//关闭模态框$(#addModal).modal(hide);//清理模态框$(#addModal [nameroleName]).val()});
controller ResponseBodyRequestMapping(value /role/save.json)public ResultEntityString saveRole(Role role){roleService.saveRole(role);return ResultEntity.successWithoutData();}
service /*** description: 添加角色* author: 斗痘侠* date: 2023/11/1 19:21* param: role**/Overridepublic void saveRole(Role role) {roleMapper.insertSelective(role);}