以后台管理框架为基础的简易sso登录,以sa-token编写的登录鉴权,重写授权信息持久层,除数据库无中间件编码。
限制: 多个项目需要连接同一个数据库。仅仅只需要这个条件,便可优雅实现SSO。
优势:
劣势:
不同模块需要能连接一个公共的数据库,如sso_demo
库。
或者必须需要可以连接同一个数据库,主要修改配置文件为db-[dev].setting
,且库中有sys_map
这张表即可优雅无感SSO。
简单来说db-[dev].setting
文件中配置的数据库,需要每个模块都能连上,
此文件配置的数据库仅需sys_map
表便可单点登录。
总结
虽说仅需sys_map
便可单点登录,但登录只是一个状态,没有办法附加额外的信息,比如登录的人员信息,角色信息,菜单信息等等。
所以,一般公共库里会包含多张关于用户信息的表,这些信息应该被所有模块公用。
|-- sso-demo 根模块
|-- .gitignore git忽略文件
|-- LICENSE 许可证信息
|-- pom.xml 依赖
|-- README.en.md
|-- README.md
|-- common 通用模块,所有模块都必须依赖此模块。
| |-- pom.xml
| |-- src
| |-- main
| | |-- java
| | | |-- com
| | | |-- wangijun
| | | |-- common
| | | |-- config
| | | | |-- DateConverter.java 日期全局入参格式化
| | | | |-- GlobalExceptionHandler.java 全局异常拦截处理
| | | | |-- JacksonConfig.java json全局配置
| | | | |-- MybatisConfig.java mybatsis-plus全局配置
| | | | |-- SaTokenDaoJdbc.java 鉴权框架持久化JDBC实现
| | | | |-- SysConfig.java 系统的全局属性配置
| | | | |-- SysMap.java 基于JDBC实现的一个简易的持久化MAP
| | | | |-- WebMvcConfig.java 全局Web相关配置,鉴权框架的配置也在此目录中
| | | | |-- XssConfig.java Xss相关配置文件
| | | |-- controller
| | | | |-- ScheduleController.java 定时任务控制器
| | | | |-- ErrorController.java 错误url处理器
| | | |-- dto
| | | | |-- CacheKey.java 缓存名字常量
| | | | |-- Const.java 全局常量存放地址
| | | | |-- DelType.java 删除类别常量
| | | | |-- LayuiMiniDto.java 前台框架初始化信息结构载体
| | | | |-- ModuleInfo.java 模块信息常量
| | | | |-- ParamPage.java 分页参数常量
| | | | |-- SerialType.java 自定义自增序列常量
| | | |-- filter
| | | | |-- XssFilter.java Xss过滤器
| | | |-- freemarker
| | | | |-- FreemarkerConfig.java FreeMarker全局配置
| | | | |-- HasPerm.java 页面鉴权自定义函数实现
| | | |-- quartz
| | | | |-- QuartzExecute.java 定时任务执行器
| | | | |-- QuartzService.java 定时任务服务
| | | | |-- QuartzStarted.java 定时任务启动
| | | | |-- base
| | | | |-- BaseQuartz.java 定时任务实现类通用接口
| | | |-- sys
| | | | |-- package-info.java 包相关信息
| | | | |-- domain 实体类
| | | | | |-- RoleMenu.java
| | | | | |-- ....
| | | | |-- mapper mapper文件
| | | | | |-- RoleMenuMapper.java
| | | | | |-- ....
| | | | |-- service 服务类
| | | | |-- ScheduleJobService.java
| | | | |-- ....
| | | |-- util 工具类
| | | | |-- AjaxBean.java 通用返回载体
| | | | |-- AjaxError.java 通用异常载体
| | | | |-- JDKSerializeUtil.java 序列化工具类
| | | | |-- JSON.java JSON工具类
| | | | |-- ServletUtil.java 如名称所示
| | | |-- xss
| | | |-- XssRequestWrapper.java Xss包裹Request
| | |-- resources
| | |-- config
| | | |-- application.yml springboot配置文件
| | | |-- db-dev.setting sso数据库连接配置
| | |-- mapper mapperXml文件
| | | |-- SysUserMapper.xml
| | |-- static 一些静态文件
| | | |-- css CSS文件
| | | | |-- layuimini.css
| | | | |-- public.css
| | | | |-- tac.css
| | | | |-- themes
| | | | |-- default.css
| | | |-- images 图片资源
| | | |-- lib JS文件
| | |-- templates 页面文件
| | |-- css.ftlh 全局CSS文件以及一些小优化
| | |-- javascript.ftlh 全局JS以及一些变量注入
| | |-- error 错误页面
| | | |-- 403.ftlh
| | | |-- 404.ftlh
| | | |-- 500.ftlh
| | |-- schedule 定时任务相关页面
| | |-- add.ftlh
| | |-- edit.ftlh
| | |-- index.ftlh
| | |-- log.ftlh
| |-- test
| |-- java
| |-- com
| |-- wangijun
| |-- common
| |-- AppTest.java
|-- core-server 中心服务,入口模块,为后台管理系统主服务。
| |-- pom.xml
| |-- src
| |-- main
| | |-- java
| | | |-- com
| | | |-- wangijun
| | | |-- CoreApplication.java 入口启动类
| | | |-- core
| | | |-- common
| | | | |-- config
| | | | | |-- CacheConfig.java 缓存配置
| | | | | |-- CleanToken.java 清理过期Token服务
| | | | | |-- DbInit.java 数据库自动初始化配置
| | | | | |-- MyResourceStore.java 验证码资源加载配置
| | | | |-- run
| | | | |-- PostRunner.java 项目启动过后执行的一些方法
| | | |-- system
| | | | |-- controller 系统相关控制器
| | | | |-- service
| | | | |-- IndexService.java 主页相关服务
| | | |-- task 定时任务
| | | |-- CleanTaskLogTask.java
| | | |-- CommonTask.java
| | | |-- ErrorTask.java
| | |-- resources
| | |-- application.yml 配置
| | |-- ehcache.xml 缓存的一些配置
| | |-- bgimages 一些图片资源
| | |-- db
| | | |-- init.sql 初始化执行的SQL
| | |-- templates 页面文件
| |-- test 测试类
| |-- java
| |-- com
| |-- wangijun
| |-- core
| |-- AppTest.java
| |-- CoreApplicationTests.java 此测试类中包括加密解密测试。此项目中数据库连接用户名以及密码为加密设置。
| |-- MyTest.java
|-- shop-module 商城模块demo,以此模块代码为模板,类似编写其他模块代码。
|-- pom.xml
|-- src
|-- main
| |-- java
| | |-- com
| | |-- wangijun
| | |-- ShopApplication.java
| | |-- shop
| | |-- common
| | | |-- config
| | | | |-- CacheConfig.java 缓存配置
| | | | |-- DbInit.java 数据库初始化服务
| | | |-- constant
| | | | |-- CacheKey.java 缓存名称常量
| | | |-- run
| | | |-- PostRunner.java 项目启动过后执行服务
| | |-- main
| | | |-- controller
| | | | |-- PayController.java
| | | |-- domain
| | | | |-- PayOrder.java
| | | |-- mapper
| | | | |-- PayOrderMapper.java
| | | |-- service
| | | |-- PayOrderService.java
| | |-- task
| | |-- CommonTask.java 定时任务实现
| |-- resources
| |-- application.yml
| |-- ehcache.xml
| |-- db
| | |-- init.sql
| |-- mapper
| | |-- PayOrderMapper.xml
| |-- templates
| |-- pay
| | |-- index.ftlh
| |-- user
|-- test
|-- java
|-- com
|-- wangijun
|-- shop
|-- AdminApplicationTests.java 测试类
00000
ENC()
)即可,需要加密解密需要用ENC(中间填写加密过后的内容)
包裹起来。common
模块,否则无法进行SSO登录查看文档
,spring.application.name
值不能相同,且不可为空。
原因为涉及到模块级别的一些功能,如日志的打印,定时任务,菜单等等,后面还可能再增加..com.wangijun.core.CoreApplicationTests#configYml
方法。com/wangijun/common/config/SysConfig.java#loginUrl
是登录url的配置,如果core-server服务部署有变动,此处也需要变动,因为登录页面是在core-server服务中。mod_code
字段,此字段为项目配置属性spring.application.name
的值,在注解中配置了fill = FieldFill.INSERT
再写入的时候就可以自动填充,无需手动赋值。是为了区分模块级别的一些功能,比如定时任务,目前定时任务代码是公用的。不同模块之间定时任务是隔离的,
因为不能不隔离,🤣🤣🤣,新增模块的话,在模块下手动添加一下定时任务的菜单即可使用定时任务。
/**
* 模块标识
*/
@TableField(value = "mod_code", fill = FieldFill.INSERT)
private String modCode;
// 注意点,common中templates/schedule/add.ftlh 和 edit.ftlh
<#if appName == 'core'>
<tips>不知道怎么写,点这里<i id="cron" class="layui-icon layui-icon-question"></i></tips>
</#if>
// 如果core-server的`spring.application.name`值变了,这里也需要同步更改,当然这是一个小细节,主要原因是非中心模块无法跳转其他tap页。
此项目主要是为了做到无中间件,仅MYSQL,以及使用iframe的需求,为了能实现单点登陆,作者也是用了一点心思。
一开始重写SaToken的Dao层实现,是为了无中间件共享服务端,到这里的时候我以为单点登陆已经完美了。
这种方式实现的单点登陆,也能用,但只能用一个共享域名,或者说只能在一个域名下,包括子域名这样,没有办法跨域名实现单点登录。
要想在不同域名下实现单点登陆,简单来说就是在不同域名下传递Cookie或者说Token,这里面就涉及到跨域问题。
这里解决跨域问题,用的是postMessage
这个API,主要用来传递主页面中的Token。具体功能代码,
接受并写入token:common/src/main/resources/templates/client.ftlh
下发Token: core-server/src/main/resources/templates/index.ftlh
中setToken
函数
配置文件地址:common/src/main/java/com/wangijun/common/config/SysConfig.java
中ssoUrl
和clientList
属性,每增加一个类似shop-module
的模块代码就需要在clientList
中增加一条记录。
注意: iframe
页面中无法使用Cookie。
新建两个数据库,sso_demo
,sso_demo_shop
,修改项目中三个文件common模块db-dev.setting
文件,
core-server模块application.yml
文件,shop-server模块application.yml
文件中的数据库连接配置,
注意只有ENC()包裹起来的配置才会进行加解密,如果不想加密,那么直接填写原配置即可。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。