mall :sa-token项目源码解析
一、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}
接口无法正常访问,返回code
为403
这里就不对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
无法正常访问,返回code
为403
这里就不对admin进行测试展示了,下方是对macro用户
进行测试,查看没有权限的效果。
四、总结
本文是有我先从实际项目中获取需求,从而对SpringSecurity
和Oath2
的学习,结合源码来学习,到另一个项目由于鉴权已经部署在不同的ip,项目使用调用即可,项目中使用了 Sa-Token 是一个轻量级 Java 权限认证框架 ,看官网是看的明白,但是不懂如何入手,就有了此文,从mall
开源项目中学习sa-token,感觉收获颇深,希望这篇文章对你们也会有所帮助。
后续我也会结合该框架学习一下其他的技术栈。
七夕~盈若安好,便是晴天
mall :sa-token项目源码解析的更多相关文章
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- [原创]android开源项目源码解析(一)----CircleImageView的源码解析
CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...
- 开源项目源码解析-PhotoView 源码解析
1. 功能介绍 特性(Features): 支持 Pinch 手势自由缩放. 支持双击放大/还原. 支持平滑滚动. 在滑动父控件下能够运行良好.(例如:ViewPager) 支持基于 Matrix 变 ...
- Github star 1.7k 的项目源码解析
先拜读源码,最后总结,以及其他实现思路.如有错误,欢迎指正! 项目介绍 名称:Darkmode.js 功能:给你的网站添加暗色模式 项目链接:https://github.com/sandoche/D ...
- Spring Security 解析(七) —— Spring Security Oauth2 源码解析
Spring Security 解析(七) -- Spring Security Oauth2 源码解析 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...
- 源码解析-Volley(转自codeKK)
Volley 源码解析 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon ...
- Volley 源码解析(转)
项目:Volley,分析者:grumoon,校对者:Trinea 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:V ...
- 【转载】Xutils3源码解析
Github源码地址:https://github.com/wyouflf/xUtils3 原文地址 :http://www.codekk.com/blogs/detail/54cfab086c476 ...
- .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析
介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...
- IdentityServer4源码解析_1_项目结构
目录 IdentityServer4源码解析_1_项目结构 IdentityServer4源码解析_2_元数据接口 IdentityServer4源码解析_3_认证接口 IdentityServer4 ...
随机推荐
- 2021-12-30:分裂问题。 一个数n,可以分裂成一个数组[n/2, n%2, n/2], 这个数组中哪个数不是1或者0,就继续分裂下去。 比如 n = 5,一开始分裂成[2, 1, 2], [2
2021-12-30:分裂问题. 一个数n,可以分裂成一个数组[n/2, n%2, n/2], 这个数组中哪个数不是1或者0,就继续分裂下去. 比如 n = 5,一开始分裂成[2, 1, 2], [2 ...
- 解决:django.db.utils.OperationalError: no such table: auth_user
解决:django.db.utils.OperationalError: no such table: auth_user 我们在创建Django项目的时候已经创建这个表了,表一般都保存在轻量级数据库 ...
- 软硬件--智能穿戴常见BUG及原因分析
软硬件--智能穿戴常见BUG及原因分析 1.手表有常亮功能(类似熄屏表盘),开启常亮暗屏状态下 按侧键,设备时间出现倒退现象:频率切换相关问题: 2.手表有常亮功能(类似熄屏表盘),开启常亮暗屏状态下 ...
- doo 13 之11 :开发之看板视图和用户端 QWeb
QWeb 是 Odoo 使用的模板引擎,它基于 XML 来生成 HTML 片断和页面.通过 QWeb可生成内容丰富的看板(Kankan)视图.报表和 CMS 网页.本文中我们将学习QWeb 语法以及如 ...
- Qt+QtWebApp开发笔记(五):http服务器html中使用json触发ajax与后台交互实现数据更新传递
前言 前面完成了页面的跳转.登录,很多时候不刷新页面就想刷新局部数据,此时ajax就是此种技术,且是异步的. 本篇实现网页内部使用js调用ajax实现异步交互数据. 在js中使用 ajax是通 ...
- 一个支持WinForms换肤的开源组件
推荐一个一键换肤的WinForms皮肤组件. 项目简介 这是一个支持自定义WinForms窗口.控件颜色.禁用状态.动画效果的皮肤组件. 支持的组件有:多选框.分割线.按钮.文本框.单选按钮.输入框. ...
- PySide6(Qt for Python) QTableWidget表头边框线问题
这个问题是在Windows10平台下特有问题. 网络上有很多Qt C++的解决方案.但是没有特定的PySide6的解决方案(以下是Qt C++的解决方案). https://blog.csdn.net ...
- Dotnet9网站回归Blazor重构,访问速度飞快,交互也更便利了!
大家好,我是沙漠尽头的狼. Dotnet9网站回归Blazor重构,访问速度确实飞快,同时用上Blazor的交互能力,站长也同步添加了几个在线工具,这篇文章分享下Blazor的重构过程,希望对大家网站 ...
- RLHF技术在智能金融中的应用:提高金融智能化和自动化水平”
目录 引言 随着人工智能技术的不断发展和普及,金融智能化和自动化水平也得到了显著提高.在这个时代,RLHF(Reinforcement Learning with Human Feedback)技术已 ...
- go网络编程(一)
[B站最深度的Golang学习到实战 up主强力推荐] https://www.bilibili.com/video/BV1TK4y1a7ex/?p=101&share_source=copy ...