一、mall开源项目

1.1 来源

mall学习教程,架构、业务、技术要点全方位解析。mall项目(50k+star)是一套电商系统,使用现阶段主流技术实现。涵盖了SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7.6.2、RabbitMQ 3.7.15、Redis 5.0、MongoDB 4.2.5、Mysql5.7等技术,采用Docker容器化部署。

项目github地址: mall开源项目

1.2 项目转移

可以把github上的项目转移到gitee上,方便克隆到idea。

具体步骤如下:

1.3 项目克隆

由于github部署在国外,虽然idea也支持从github上拉取,但是克隆速度太慢,所以才推荐上述导入gitee后在克隆项目到idea。

具体的克隆步骤过于简单和常规化,读者可自行完成,或百度一下~

二、Sa-Toekn框架

2.1 Sa-Token 简介

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证权限认证单点登录OAuth2.0分布式Session会话微服务网关鉴权 等一系列权限相关问题。

Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。

功能概览图如下:

sa-token开发文档地址: 框架介绍 (sa-token.cc)

2.2 分布式后端项目的使用流程

下图是结合项目经历,外加百度查找资料,自行总结的基本使用流程。

sa-token的使用流程图如下:

2.3 分布式后端项目的使用场景

下图是结合项目经历,外加百度查找资料,自行总结的基本使用场景。

sa-token的使用场景图如下:

三、源码解析

看源码自我总结出来的看新项目时的基本步骤,首先先看集成和配置,在从业务的角度来分析,结合集成的框架和组件,来依次剥削系统的架构。

解析内容:下方的解析内容大部分在图中解释,外面就不做过多的阐述。

3.1 集成与配置

直接拿源码分析,只分析与sa-token有关的部分,其它部分读者请,自行看源码分析。

项目启动:只需要启动mall-tiny-sa-token模块的部分即可。

启动所需:启动mysql5的服务,创建数据库,并导入表(sql文件位置在,项目同级目录的document文件夹里)。

ps:记得修改数据库连接的配置信息。

3.1.1 导入依赖

pom文件中导入sa-token的相关依赖。

3.1.2 添加配置

application.yml中添加sa-token的相关配置,项目支持前后端分离项目,关闭从 cookie 中读取 token,改为从 head 中读取 token的配置。

3.1.3 异常处理

对于处理未登录的、没有权限的、没有角色的异常,需要全局处理一下。

拿登录来做个小例子:由于未登录状态下访问接口,Sa-Token 会抛出NotLoginException异常,此时会根据自定义的返回信息,返回状态码401和响应信息未提供token(异常处理的结果信息)。

3.1.4 存储用户信息

有两个用户,admin用户具有ROLE_ADMIN角色,macro用户具有ROLE_USER角色。

ps:模拟数据库两张表的关联信息是根据id来关联的,也就是给用户分配角色。

3.2 登录认证

3.2.1 配置黑白名单

在管理系统中,除了登录接口,基本上都需要登录认证,在 sa-token中使用路由拦截鉴权是最方便的,也就是说给sa-token配置拦截器,实现WebMvcConfigurer接口,配置黑白名单。

ps:自定义的白名单是从application.yml文件中获取到的信息。

3.2.2 登录业务代码解读

1.首先是控制层, 在UmsAdminController中添加一个登录接口login

2.接着业务层, 在UmsAdminServiceImpl添加登录的具体逻辑,先验证密码,然后调用StpUtil.login(adminUser.getId())即可实现登录。

3.2.3 测试登录

方式一:使用Postman测试

方式二:使用swagger接口文档测试(建议使用,以及编写好,直接访问即可测试,访问地址为: Swagger UI ),由于已经拿到token,就不做重复测试了,直接测另一个接口,查询当前登录状态的接口。

3.3 角色认证

紧接上文,我来实现一下吧!对于角色认证也就是定义好一套访问接口的规则,比如ROLE-ADMIN角色可以访问/brand下的所有资源,而ROLE_USER角色只能访问/brand/listAll下的资源。

配置全局异常:见副标题3.1.3有所描述,不做过多陈诉。

当用户不是被允许的角色访问时,Sa-Token会抛出NotRoleException异常。

3.3.1 权限验证接口扩展

扩展 sa-token的StpInterface接口,重写方法来返回用户的角色名称和角色权限列表。

由于StpInterfaceImpl实现了StpInterface接口,重写了里面的方法。所以在SaTokenConfig的配置文件中的StpUtil.checkRole("ROLE_ADMIN")才能匹配到模拟的数据库的角色信息。权限信息也是同理,不一一列举了。

3.3.2 配置拦截器

在拦截器中配置路由规则,ROLE_ADMIN角色可以访问所有路径,而ROLE_USER只能访问/brand/listAll路径。

3.3.3 测试角色

对于 admin用户具有ROLE_ADMIN角色,macro用户具有ROLE_USER角色 。

  • 使用admin账号访问/brand/{id}接口可以正常访问
  • 使用macro账号访问/brand/{id}接口无法正常访问,返回code403

这里就不对admin进行测试展示了,下方是对macro用户进行测试,查看没有权限的效果。

3.4 权限认证

当给角色分配好权限,然后给用户分配好角色后,用户就拥有了这些权限。

对于权限认证,也可以为每个接口分配不同的权限,拥有该权限的用户就可以访问该接口。

配置全局异常:见副标题3.1.3有所描述,不做过多陈诉。

用户无权限访问时,Sa-Token 会抛出NotPermissionException异常。

3.4.1 配置拦截器

给拦截器配置路由规则admin用户可以访问所有路径,而macro用户只有读取的权限,没有写、改、删的权限。

3.4.2 测试权限

对于 admin用户可以访问所有路径,而macro用户只有读取的权限,没有写、改、删的权限。

  • 使用admin账号访问/brand/delete接口可以正常访问
  • 使用macro账号访问/brand/delete无法正常访问,返回code403

这里就不对admin进行测试展示了,下方是对macro用户进行测试,查看没有权限的效果。

四、总结

本文是有我先从实际项目中获取需求,从而对SpringSecurityOath2的学习,结合源码来学习,到另一个项目由于鉴权已经部署在不同的ip,项目使用调用即可,项目中使用了 Sa-Token 是一个轻量级 Java 权限认证框架 ,看官网是看的明白,但是不懂如何入手,就有了此文,从mall开源项目中学习sa-token,感觉收获颇深,希望这篇文章对你们也会有所帮助。

后续我也会结合该框架学习一下其他的技术栈。

七夕~盈若安好,便是晴天

mall :sa-token项目源码解析的更多相关文章

  1. Android 开源项目源码解析(第二期)

    Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...

  2. [原创]android开源项目源码解析(一)----CircleImageView的源码解析

    CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...

  3. 开源项目源码解析-PhotoView 源码解析

    1. 功能介绍 特性(Features): 支持 Pinch 手势自由缩放. 支持双击放大/还原. 支持平滑滚动. 在滑动父控件下能够运行良好.(例如:ViewPager) 支持基于 Matrix 变 ...

  4. Github star 1.7k 的项目源码解析

    先拜读源码,最后总结,以及其他实现思路.如有错误,欢迎指正! 项目介绍 名称:Darkmode.js 功能:给你的网站添加暗色模式 项目链接:https://github.com/sandoche/D ...

  5. Spring Security 解析(七) —— Spring Security Oauth2 源码解析

    Spring Security 解析(七) -- Spring Security Oauth2 源码解析   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...

  6. 源码解析-Volley(转自codeKK)

    Volley 源码解析 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon ...

  7. Volley 源码解析(转)

    项目:Volley,分析者:grumoon,校对者:Trinea 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:V ...

  8. 【转载】Xutils3源码解析

    Github源码地址:https://github.com/wyouflf/xUtils3 原文地址 :http://www.codekk.com/blogs/detail/54cfab086c476 ...

  9. .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

    介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...

  10. IdentityServer4源码解析_1_项目结构

    目录 IdentityServer4源码解析_1_项目结构 IdentityServer4源码解析_2_元数据接口 IdentityServer4源码解析_3_认证接口 IdentityServer4 ...

随机推荐

  1. 1451, 'Cannot delete or update a parent row: a foreign key constraint fails

    问题描述:1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`sysProDB4`.`IM003 ...

  2. js 字符串格式数组转为数组对象

    工作中经常会遇到将json字符串转换为json对象,但是将字符串格式数组转为数组对象的场景却不多 如: 其中label_exp: "["cap_pop","wk ...

  3. 源码解析:django的CSRF认证

    详解Django的CSRF认证 1.csrf原理 csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,客户端第二次发送post ...

  4. 【jmeter】测试socket接口的简单应用

    一.场景 有一天开发问我,有没有什么工具可以测试socket,tcp,当时有点懵,这种需求还是少见 二.方法 使用Jmeter可以进行相关的测试 三.创建服务端环境 使用python搞个socket服 ...

  5. 7-9 《Fibonacci 数列》

    7-9 <Fibonacci 数列> 思路:吃过前面<序列求和>问题的亏 但还是要尝试一下循环大法 Fn=Fn-1+Fn-2 定义int型 aFn-1 , bFn-2 , cF ...

  6. 远程挂载 NFS 共享目录引发死机问题

    集群的存储空间有限,把一些历史的归档数据放在了公司的另外一台老旧存储服务器上,并使用 NFS 把它挂载到了 log 节点.周末的时候机房空调故障,旧存储服务器挂掉了!周一上班,在集群登陆节点使用df ...

  7. Go语言中的原子操作

    1. 引言 在并发编程中,多个协程同时访问和修改共享数据时,如果没有使用适当的机制来防止并发问题,这个时候可能导致不确定的结果.数据不一致性.逻辑错误等严重后果. 而原子操作是解决并发编程中共享数据访 ...

  8. 【python基础】类-类属性

    在初始类中,我们介绍了如何访问类属性,除了访问类属性外还有其他操作类属性的情况,我们将在这里做详细介绍: 1.给类属性指定默认值 类中的每个属性都必须有初始值,哪怕这个值是0或者空字符串.在有些情况下 ...

  9. 02-面试必会-SSM框架篇

    01-什么是 Spring IOC 和 DI ? IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理.所谓的"控制反转&quo ...

  10. GPU技术在大规模数据集处理和大规模计算中的应用

    目录 GPU 技术在大规模数据集处理和大规模计算中的应用 随着深度学习在人工智能领域的快速发展,大规模数据处理和大规模计算的需求日益增长.GPU(图形处理器)作为现代计算机的重要部件,被广泛应用于这些 ...