• springboot 实现权限管理(一)


    一、背景

    1、 为什么进行权限管理?
    生活在形形色色的世界之中,我们各自扮演着各自的角色,拥有不同的权利和义务。映射在计算机系统之中,也一样需要 角色、权限 来进行对用户的分类,限制访问资源,保证资源地合理被使用,使人各司其职。
    2、应用场景
    假设 管理员可以对用户进行CRUD的管理,而普通用户往往只拥有对资源的查看,无法进行删除等高级权限。
    3、SpringBoot实现主要的方式
    (1)采用注解+拦截器
    (2)Shiro框架
    (3)Spring Security
    4、重点理解
    (1)理解用户、角色、权限的概念
    (2)分类资源(对应相应的权限),一般可以有数据权限、操作权限、访问权限等,表现为对URL(URI)的访问控制;URL即标识了访问数据,图片等。
    (3)将用户,角色,权限 在库表设计时的五张表理解。在关系数据库中,由于原子性(第一规范),因此需要两张关联表进行管理用户和角色,角色和权限。

    二、实现

    1. 实现逻辑:采用自底向上的思维

    2. 设计库表
      在这里插入图片描述

      create table crm.cus_user
      (
      id int auto_increment
      primary key,
      username varchar(50) not null,
      password varchar(255) not null,
      name varchar(31) null,
      sex varchar(2) null,
      phone varchar(11) null,
      address varchar(255) null,
      dept_id varchar(100) null,
      create_time timestamp null
      )
      comment ‘用户表’;

      create table crm.cus_role
      (
      id int auto_increment
      primary key,
      name varchar(255) null,
      create_time timestamp null,
      create_user_id int null,
      update_time timestamp null,
      update_user_id timestamp null
      )
      comment ‘用户角色表’;

      create table crm.cus_permission
      (
      id int auto_increment
      primary key,
      name varchar(255) null,
      pid int null,
      level int null,
      mark varchar(255) null
      )
      comment ‘用户权限表’;
      create table crm.role_permission
      (
      id int auto_increment
      primary key,
      role_id int null,
      permission int null
      )
      comment ‘角色权限关联表’;

      create table crm.user_role
      (
      id int auto_increment
      primary key,
      user_id int null,
      role_id int null
      )
      comment ‘用户权限关联表’;

    3. 处理逻辑分析

    (1)用户访问非登录URL,则查看token(存储在header);若token失效则返回失效,token未失效进行权限查看(token及权限信息等常用个人信息采用Redis进行缓存),有权限放行,无权限拦截;
    (2)用户访问登录URL,则无需拦截,判断用户、密码,进行缓存个人信息(查询关系数据库的用户角色、权限信息后进行缓存),并返回token给用户作为下次登录凭证;

    1. 具体代码

    (1)工程结构:
    在这里插入图片描述
    按照 MVC的工程结构:分为 controller,service,dao;
    controller:暴露访问资源的URL,使用注解进行注解需要权限的class或method;
    service:实现登录逻辑,登录验证,保存token。
    dao:访问数据库(采用JPA)
    interceptor:进行拦截处理
    (2)Postman进行测试
    (3)关于Token的生成
    在此简单采用的Md5简单加密,好处是简单,坏处是token不具动态性;采用采用策略模式进行设计不同的加密方式(JWT,等)

    代码:见Gitee
    三、项目地址 gitee

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Enterprise Architect安装使用
    centos7添加/dev/sdb
    第4季4:图像sensor的驱动源码解析
    UE5主视口导航快捷键汇总
    代码随想录第42天 | ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费
    MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布
    安卓的一些官方测试案例
    天翼云推出全栈政务混合云 支持私有化运行
    Qcom查看算法库编译工具版本的方法
    SpringBoot 2.5.5整合轻量级的分布式日志标记追踪神器TLog
  • 原文地址:https://blog.csdn.net/iijik55/article/details/126114254