1 Star 0 Fork 0

wlf / sso-demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

sso-demo 单点登录脚手架

介绍

以后台管理框架为基础的简易sso登录,以sa-token编写的登录鉴权,重写授权信息持久层,除数据库无中间件编码。

限制: 多个项目需要连接同一个数据库。仅仅只需要这个条件,便可优雅实现SSO。

主要技术

  • jdk 17
  • springboot 2.7.x
  • sa-token 1.36.0
  • mybatis-plus 3.5.4
  • hutool-all 5.8.20

项目特点

优势:

  1. 除数据库无中间件设计
  2. 单机缓存
  3. 百分之99零SQL项目中几乎看不到SQL
  4. SSO登录
  5. 代码工整

劣势:

  1. 不同模块需要能连接一个公共的数据库,如sso_demo库。 或者必须需要可以连接同一个数据库,主要修改配置文件为db-[dev].setting,且库中有sys_map这张表即可优雅无感SSO。

  2. 简单来说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  测试类

额外说明

  1. 新建用户默认密码为00000
  2. 项目中所有数据库的用户名以及密码都为root,且为加密的报文形式,如果不不需要加密需求, 则正常填写(即不包含ENC())即可,需要加密解密需要用ENC(中间填写加密过后的内容)包裹起来。
  3. 后面新增模块必须依赖common模块,否则无法进行SSO登录
  4. 项目包名层级问题,在不了解SpringBoot的扫描机制的前提下,不建议擅自修改包名或者包的层级。
  5. 项目启动时需要配置对应的数据库,用户名以及密码,配置无误后,启动即可,项目会自动初始化表结构以及初始数据。 具体初始化相关信息点击查看文档,
  6. 不同模块中springboot配置项spring.application.name值不能相同,且不可为空。 原因为涉及到模块级别的一些功能,如日志的打印,定时任务,菜单等等,后面还可能再增加..
  7. 加解密测试demo位置core-server模块中com.wangijun.core.CoreApplicationTests#configYml方法。
  8. com/wangijun/common/config/SysConfig.java#loginUrl是登录url的配置,如果core-server服务部署有变动,此处也需要变动,因为登录页面是在core-server服务中。
  9. 关于部分表中的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.ftlhsetToken函数

配置文件地址:common/src/main/java/com/wangijun/common/config/SysConfig.javassoUrlclientList属性,每增加一个类似shop-module的模块代码就需要在clientList中增加一条记录。

注意: iframe页面中无法使用Cookie。

开发启动

新建两个数据库,sso_demo,sso_demo_shop,修改项目中三个文件common模块db-dev.setting文件,

core-server模块application.yml文件,shop-server模块application.yml文件中的数据库连接配置,

注意只有ENC()包裹起来的配置才会进行加解密,如果不想加密,那么直接填写原配置即可。

MIT License Copyright (c) 2023 wlf Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

以后台管理框架为基础的简易sso登录,以sa-token编写的登录鉴权,重写授权信息持久层,除数据库无中间件编码。限制为,多个项目需要能连接同一个数据库。仅仅只需要这个条件,便可优雅实现SSO。 展开 收起
JavaScript 等 6 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/wlf213/sso-demo.git
git@gitee.com:wlf213/sso-demo.git
wlf213
sso-demo
sso-demo
master

搜索帮助