通俗易懂权限管理模块设计-Java

2023-11-18

最近一直在做CMS系统,发现一些内容其实都是重复出现的,例如权限管理模块。权限管理模块就是为了管理用户是否有权利访问某个权限,如果不能则拒绝访问。其实Java中已经有很成熟的权限管理框架,例如 Shiro,Spring Security等,也推荐大家使用。但是一些设计上的东西还是要重复再造过轮子才能发现里面的精髓,所以这份代码,供不太明白的同学也参考参考。

代码分享在 Github 上,欢迎大家指出问题: https://github.com/yixiaoming/cms

下面我将详细介绍一下这个简单的权限管理模块,以便大家可以拿去直接使用。

数据表

这里写图片描述

主要三张表

  • t_user:用户表,访问系统的对象
  • t_permission:权限表,每条记录就是一个权限,也就是一个 url 地址
  • t_group:用户组表,一个组可以包含多个权限,用户如果在这个组中,则享有所有权限

简单例子

来个简单的例子,例如一个CMS系统中,有一些权限:添加文章( /admin/article/add),查看文章( /admin/article/{id}),删除文章( /admin/delete/{id}),修改文章( /admin/article/update/{id}),每个权限其实对应一个controller的 requet 地址。这些内容存放在 t_permission 中。

然后系统中有一些用户都放在 t_user中,然后我可以为 每个user 分配一些权限,一个user叫 张三,我可以给他直接添加权限:查看文章。那么他只能查看,不能增删改。

然后用户组表可以看作一个部门,例如一个用户组叫:文章管理组,那么这个组可以添加:文章的增删改查4项权限。现在我再将 user分配到 文章管理组 中,那么张三就拥有了 文章的增删改查的所有权限。

最主要的思想就是:用户的权限,可以直接分配,也可以通过用户组来分配,用户的所有权限就是两者的并集

框架

  1. Spring 4.26
  2. Hibernate 5.10
  3. Java 8

例子采用 SpringMVC + Hibernate + Bootstrap搭建,简单实用,对于小项目使用绝对没有问题。
然后里面也用到了一些开源的Web前端项目,例如SB-Admin,Bootstrap Multiselect,MetisMenu,Bootstrap Validation等,由于我本来不是做前端的,所以UI上的东西只能借助开源项目来完成。下面展示一下效果:

登陆页

这里写图片描述

用户列表页,用户组列表页,权限列表页 都类似

这里写图片描述

用户添加,修改页:

这里写图片描述

选择权限

这里写图片描述

选择用户组

这里写图片描述

当选定了权限和用户组,那么用户的权限就是 权限+角色组所有的权限 的并集。

登陆成功后将所有权限放在session中:

LoginController

List<Permission> permissions = userService.listUserPermissions(user.getId());
    List<Integer> gids = userService.listUserGids(user.getId());
    List<Permission> groupPermissions = groupService.listGroupsPermissions(ListUtil.list2array(gids));

    for (Permission p : groupPermissions) {
      if (!permissions.contains(p)) {
        permissions.add(p);
      }
    }

    request.getSession().setAttribute(Constant.LOGIN_USER, user);
    request.getSession().setAttribute(Constant.LOGIN_PERMISSIONS, permissions);

然后写两个个拦截器,一个判断登录,一个判断权限,每次访问链接前先判断是否有这个权限,如果没有则抛出异常。这里有一点还需要注意,如果用户的类型使 Admin 的话,那么默认就拥有所有权限,所以不需要验证。通过 user 的 isAdmin 字段判断

LoginInterceptor

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
    User user = (User) request.getSession().getAttribute(Constant.LOGIN_USER);
    if (request.getRequestURL().toString().contains("/admin")) {
      if (user == null) {
        response.sendRedirect(request.getContextPath() + "/login");
        return false;
      }
    }
    return true;
  }

PermissionInterceptor

 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
    String url = request.getRequestURL().toString();
    if (url.contains("/admin")) {
      List<Permission> permissions = (List<Permission>) request.getSession().getAttribute(Constant.LOGIN_PERMISSIONS);
      User user = (User) request.getSession().getAttribute(Constant.LOGIN_USER);

      if (permissions == null || user == null) {
        response.sendRedirect(request.getContextPath() + "/login");
        return false;
      }

      // 如果是admin,就不需要权限验证
      if (user.getAdmin()) {
        return true;
      }

      boolean hasPermission = false;
      for (Permission permission : permissions) {
        if (url.contains(permission.getUrl())) {
          hasPermission = true;
          break;
        }
      }

      if (!hasPermission) {
        throw new CmsException("没有权限访问:" + url);
      }
    }

    return true;
  }

总结

这里洋洋洒洒的写了一些权限模块中的内容,只是里面的主线,细节的代码大家可以参考Github上的代码地址链接,大神略过。希望能给正在学习这个内容的同学一点帮助,反正造这个轮子,我学到了不少。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通俗易懂权限管理模块设计-Java 的相关文章

随机推荐

  • mysql for centos_centos7下安装mysql及测试centos

    步骤1 下载并安装MySQL wget http dev mysql com get mysql community release el7 5 noarch rpm rpm ivh mysql community release el7
  • Android studio3.0对于百度地图api开发(8)——百度地图开发思考

    随着对于百度地图SDK的不断深入 对于百度地图的基本操作以及实现 每一块功能就像是一个个工具 他们功能不同 又能相互组合 这就为我们开发者提供了一个很好的平台 在这个平台 开发人员可以进行根据自己的需求进行组装 为了更好的交流 相互学了 我
  • 苹果cmsV10-Dplayer播放器插件整合前置广告、暂停广告

    简介 Dplayer播放器 整合前置广告 暂停广告3 0免费版 很多朋友在用maccms的时候会遇到采集的视频资源存在大量的广告 这款Dplayer播放器不经能去除视频里的垃圾广告 还能站长自己添加广告 播放器整合说明 1 整合的苹果cms
  • 程序员整体架构之开发架构

    开发架构 文章目录 开发架构 概述 前言 互联网发展特点 单体架构 面向服务架构 SOA 水平分层架构 微服务架构 水平拆分 垂直拆分 服务网格架构 中台架构 云原生架构 Serverless 架构 小结 公众号 概述 简述了互联网业务发展
  • springboot的多环境配置(测试,开发,生产)

    众所周知再开发过程中 从开发 测试 上线 至少也得有3个环境 然而每个环境的配置都不一样 例如数据库配置 Redis配置 等各种配置 如果在打包环节来一个一个进行修改配置的话 非常容易出错 对于多环境配置 也有很多的构建工具 而他们的原理基
  • unity3d笔记-Input.GetAxis

    关于Input GetAxis 1 Input GetAxis Horizontal 获得键盘上的A D键 2 Input GetAxis Vertical 获得键盘上的W S键 3 Input GetAxis Mouse x 获得鼠标沿屏
  • 图像紫边消除(depurple)

    图像紫边广泛存在于目前的手机摄像头 数码相机 监控摄像头等数字成像系统所得图像中 当我们使用这些设备在逆光 大光圈等条件下拍摄时 所得图像的局部区域 特别是高反差区域 亮暗对比反差很大的图像区域 比如天空 灯管与物体相接的边缘 会比较容易观
  • 通过h5页面上传视频到Linux服务器

    1 上传视频到本地 https www jb51 net article 132531 htm 2 上传视频到Linux服务器 建立ftp连接 保证服务器已经安装ftp及对应端口 帐号有权限 上传视频 https blog csdn net
  • 基于实数编码的遗传算法搜寻多元函数最值

    遗传算法介绍 遗传算法于20世纪70年代由美国的John holland提出 是一种通过模仿达尔文生物进化理论和遗传机制以寻求问题最优解的启发式算法 算法的运作主要依赖于三大算子 选择 交叉 变异 其算法流程如图1所示 图1 遗传算法流程图
  • 作为一枚python小白如何提升项目实战——Python茅台抢购脚本详细教程

    今天给大家推荐的GitHub开源项目就是一款京东抢茅台的脚本 当然推荐的脚本也是仅用于测试和学习研究 禁止用于商业用途 不能保证其合法性 准确性 完整性和有效性 请根据情况自行判断 主要功能 预约茅台 定时自动预约 秒杀预约后等待抢购 定时
  • Python IO编程详解

    一 文件系统操作 1 os os path和pathlib的对比 Python中处理文件路径和文件系统操作的传统方式 是通过os和os path模块中的函数来完成的 这些函数完全能够胜任需求 但往往会使得代码过于冗长 自Python 3 5
  • java随机生成6位数

    生成6位随机数 仅只有6位 int Math random 9 1 100000 Math Random 函数能够返回带正号的double值 该值大于等于0 0且小于1 0 即取值范围是 0 0 1 0 的左闭右开区间
  • 理解 __declspec(dllexport)和__declspec(dllimport)

    这段时间要把tinyxml从静态库弄成动态库 要用到 declspec dllexport 和 declspec dllimport 来导出dll和lib文件 终于弄明白了export和import的作用 下面从使用的角度来说明一下他们的功
  • 2020北京邮电大学计算机学院复试经验分享

    初试组内第4 复试组内第1 综合第2 已成功上岸 最近大家问我复试的比较多 趁还热乎 在这里给大家分享一下吧 仅供参考 然后初试经验贴在这里 不要因为初试成绩不好就放弃复试或者不认真对待 复试是干嘛的就是用来翻盘的 都坚持了一年了 也不差这
  • C# 获取计算机信息

    文章目录 一 本机信息 1 本机名 2 获得本机MAC地址 3 获得计算机名 4 显示器分辨率 5 主显示器分辨率 6 系统路径 二 操作系统信息 1 操作系统类型 2 获得操作系统位数 3 获得操作系统版本 三 处理器信息 1 处理器个数
  • Sublime Text3设置文本的自动换行

    1 点击Preferences Settings 然后出现以下页面 2 点击保存即可 如果想要修改其他属性 可以直接在Default里面找就可以
  • Java正则表达式验证电话号码

    在注册会员时 经常需要输入电话号码 电话号码是指手机号码或者固定电话 如果输入的内容不合法 则会向用户输出提示 本实例模拟实现电话号码的验证功能 接收用户在控制台输入的电话号码 然后进行判断 并将结果输出 在这里使用 Java正则表达式 一
  • linux改变文件所属用户和组

    1 改变文件所属用户 chown 用户名 文件名 2 改变文件所属组 chgrp 用户名 文件名
  • 狂神说-Mybatis笔记(总)

    环境 JDK1 8 MySQL 8 0 23 maven 3 6 1 IDEA2020 3 框架 需要配置文件 官方中文文档 https mybatis org mybatis 3 zh index html 一 简介 1 什么是Mybat
  • 通俗易懂权限管理模块设计-Java

    最近一直在做CMS系统 发现一些内容其实都是重复出现的 例如权限管理模块 权限管理模块就是为了管理用户是否有权利访问某个权限 如果不能则拒绝访问 其实Java中已经有很成熟的权限管理框架 例如 Shiro Spring Security等