sso server 登录

This commit is contained in:
Github_lizhw 2024-12-07 23:17:21 +08:00
parent 586942d623
commit 477daddedb
16 changed files with 443 additions and 260 deletions

View File

@ -40,6 +40,11 @@ public interface CacheNames {
*/ */
String SYS_CLIENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_client#30d"; String SYS_CLIENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_client#30d";
/**
* 客户端
*/
String SYS_SAAS_CLIENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_saas_client#30d";
/** /**
* 用户账户 * 用户账户
*/ */

View File

@ -11,7 +11,9 @@ RUN mkdir -p /ruoyi/server/logs \
WORKDIR /ruoyi/server WORKDIR /ruoyi/server
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" ENV SERVER_PORT=19000 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
# 设置一个默认的容器名
ENV CONTAINER_NAME ruoyi-sso-server
EXPOSE ${SERVER_PORT} EXPOSE ${SERVER_PORT}

View File

@ -1,184 +1,178 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-modules</artifactId> <artifactId>ruoyi-modules</artifactId>
<version>${revision}</version> <version>${revision}</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-sso-server</artifactId> <artifactId>ruoyi-sso-server</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<description> sso-server </description> <description>sso-server</description>
<!-- 定义 Sa-Token 版本号 --> <!-- 定义 Sa-Token 版本号 -->
<properties> <properties>
<sa-token.version>1.38.0</sa-token.version> <sa-token.version>1.38.0</sa-token.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot Web依赖 --> <dependency>
<dependency> <groupId>org.dromara</groupId>
<groupId>org.springframework.boot</groupId> <artifactId>ruoyi-common-core</artifactId>
<artifactId>spring-boot-starter-web</artifactId> </dependency>
</dependency> <!-- 缓存服务 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-redis</artifactId>
<version>${revision}</version>
</dependency>
<dependency> <!-- 租户模块 -->
<groupId>org.dromara</groupId> <dependency>
<artifactId>ruoyi-common-core</artifactId> <groupId>org.dromara</groupId>
</dependency> <artifactId>ruoyi-common-tenant</artifactId>
<!-- 缓存服务 --> <version>${revision}</version>
<dependency> </dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-redis</artifactId>
<version>${revision}</version>
</dependency>
<!-- RuoYi Common Redis--> <!-- 远程调用模块 TODO rename -->
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-common-redis</artifactId> <artifactId>ruoyi-api-system</artifactId>
</dependency> </dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ --> <dependency>
<dependency> <groupId>org.dromara</groupId>
<groupId>cn.dev33</groupId> <artifactId>ruoyi-common-log</artifactId>
<artifactId>sa-token-spring-boot3-starter</artifactId> </dependency>
</dependency> <dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-ratelimiter</artifactId>
</dependency>
<!-- Sa-Token 整合 jwt --> <dependency>
<dependency> <groupId>org.dromara</groupId>
<groupId>cn.dev33</groupId> <artifactId>ruoyi-common-social</artifactId>
<artifactId>sa-token-jwt</artifactId> </dependency>
</dependency> <dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-encrypt</artifactId>
</dependency>
<!-- <dependency>--> <!-- &lt;!&ndash; 安全模块 &ndash;&gt;-->
<!-- <groupId>com.github.ben-manes.caffeine</groupId>--> <!-- <dependency>-->
<!-- <artifactId>caffeine</artifactId>--> <!-- <groupId>org.dromara</groupId>-->
<!-- </dependency>--> <!-- <artifactId>ruoyi-common-security</artifactId>-->
<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) --> <!-- <version>${revision}</version>-->
<dependency> <!-- </dependency>-->
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId>
<version>1.38.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- Sa-Token 插件整合SSO -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sso</artifactId>
<version>1.38.0</version>
</dependency>
<!-- Sa-Token 插件整合SSO -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sso</artifactId>
<version>1.38.0</version>
</dependency>
<!-- &lt;!&ndash; 安全模块 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.dromara</groupId>-->
<!-- <artifactId>ruoyi-common-security</artifactId>-->
<!-- <version>${revision}</version>-->
<!-- </dependency>-->
<!-- 租户模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-tenant</artifactId>
<version>${revision}</version>
</dependency>
<!-- 远程调用模块 TODO rename -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api-system</artifactId>
</dependency>
<!-- Apache Dubbo 配置 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-nacos-spring-boot-starter</artifactId>
</dependency>
<!-- JustAuth 的依赖配置--> <dependency>
<dependency> <groupId>com.alibaba.cloud</groupId>
<groupId>me.zhyd.oauth</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<artifactId>JustAuth</artifactId> </dependency>
<version>1.16.6</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-log</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-ratelimiter</artifactId>
</dependency>
<dependency> <!-- SpringBoot Web依赖 -->
<groupId>cn.hutool</groupId> <dependency>
<artifactId>hutool-captcha</artifactId> <groupId>org.springframework.boot</groupId>
</dependency> <artifactId>spring-boot-starter-web</artifactId>
<dependency> </dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-social</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-encrypt</artifactId>
</dependency>
<!-- <dependency>--> <!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ -->
<!-- <groupId>org.apache.dubbo</groupId>--> <dependency>
<!-- <artifactId>dubbo-metadata-report-redis</artifactId>--> <groupId>cn.dev33</groupId>
<!-- <exclusions>--> <artifactId>sa-token-spring-boot3-starter</artifactId>
<!-- <exclusion>--> </dependency>
<!-- <groupId>redis.clients</groupId>-->
<!-- <artifactId>jedis</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
</dependencies> <!-- Sa-Token 整合 jwt -->
<build> <dependency>
<finalName>${project.artifactId}</finalName> <groupId>cn.dev33</groupId>
<plugins> <artifactId>sa-token-jwt</artifactId>
<plugin> </dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<version>${spring-boot.version}</version> <dependency>
<executions> <groupId>cn.dev33</groupId>
<execution> <artifactId>sa-token-redis-jackson</artifactId>
<goals> <version>1.38.0</version>
<goal>repackage</goal> </dependency>
</goals> <dependency>
</execution> <groupId>org.apache.commons</groupId>
</executions> <artifactId>commons-pool2</artifactId>
</plugin> </dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId> <!-- Sa-Token 插件整合SSO -->
<artifactId>maven-jar-plugin</artifactId> <dependency>
<version>${maven-jar-plugin.version}</version> <groupId>cn.dev33</groupId>
</plugin> <artifactId>sa-token-sso</artifactId>
</plugins> <version>1.38.0</version>
</build> </dependency>
<!-- Sa-Token 插件整合SSO -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sso</artifactId>
<version>1.38.0</version>
</dependency>
<!-- Apache Dubbo 配置 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-nacos-spring-boot-starter</artifactId>
</dependency>
<!-- JustAuth 的依赖配置-->
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
<version>1.16.6</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.dubbo</groupId>-->
<!-- <artifactId>dubbo-metadata-report-redis</artifactId>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>redis.clients</groupId>-->
<!-- <artifactId>jedis</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
</plugin>
</plugins>
</build>
</project> </project>

View File

@ -1,78 +0,0 @@
package org.ruoyi.sso.server.controller;
import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.util.IdUtil;
import org.ruoyi.sso.server.domain.vo.CaptchaVo;
import org.ruoyi.sso.server.enums.CaptchaType;
import org.ruoyi.sso.server.properties.CaptchaProperties;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.reflect.ReflectUtils;
import org.dromara.common.ratelimiter.annotation.RateLimiter;
import org.dromara.common.ratelimiter.enums.LimitType;
import org.dromara.common.redis.utils.RedisUtils;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.Duration;
/**
* 验证码操作处理
*
* @author Lion Li
*/
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
public class CaptchaController {
private final CaptchaProperties captchaProperties;
/**
* 生成验证码
*/
@RateLimiter(time = 60, count = 10, limitType = LimitType.IP)
@GetMapping("/code")
public R<CaptchaVo> getCode() {
CaptchaVo captchaVo = new CaptchaVo();
boolean captchaEnabled = captchaProperties.getEnabled();
if (!captchaEnabled) {
captchaVo.setCaptchaEnabled(false);
return R.ok(captchaVo);
}
// 保存验证码信息
String uuid = IdUtil.simpleUUID();
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
// 生成验证码
CaptchaType captchaType = captchaProperties.getType();
boolean isMath = CaptchaType.MATH == captchaType;
Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
captcha.setGenerator(codeGenerator);
captcha.createCode();
// 如果是数学验证码使用SpEL表达式处理验证码结果
String code = captcha.getCode();
if (isMath) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
code = exp.getValue(String.class);
}
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
captchaVo.setUuid(uuid);
captchaVo.setImg(captcha.getImageBase64());
return R.ok(captchaVo);
}
}

View File

@ -10,30 +10,46 @@ import cn.dev33.satoken.sso.util.SaSsoConsts;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaFoxUtil;
import cn.dev33.satoken.util.SaResult; import cn.dev33.satoken.util.SaResult;
import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import org.ruoyi.sso.server.domain.vo.LoginVo;
import org.ruoyi.sso.server.service.IAuthStrategy;
import org.ruoyi.sso.server.service.SysLoginService;
import org.ruoyi.sso.server.config.satoken.LoginSaasHelper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.domain.model.LoginBody;
import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.MessageUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.core.utils.reflect.ReflectUtils;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.ratelimiter.annotation.RateLimiter;
import org.dromara.common.ratelimiter.enums.LimitType;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.system.api.RemoteClientService; import org.dromara.system.api.RemoteClientService;
import org.dromara.system.api.domain.vo.RemoteClientVo; import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.ruoyi.sso.server.config.satoken.LoginSaasHelper;
import org.ruoyi.sso.server.domain.vo.CaptchaVo;
import org.ruoyi.sso.server.domain.vo.LoginVo;
import org.ruoyi.sso.server.enums.CaptchaType;
import org.ruoyi.sso.server.properties.CaptchaProperties;
import org.ruoyi.sso.server.service.IAuthStrategy;
import org.ruoyi.sso.server.service.SysLoginService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.expression.Expression;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.expression.ExpressionParser;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import java.time.Duration;
/** /**
* Sa-Token-SSO Server端 Controller * Sa-Token-SSO Server端 Controller
* *
@ -44,10 +60,49 @@ import org.springframework.web.servlet.ModelAndView;
@Slf4j @Slf4j
public class SsoServerController { public class SsoServerController {
private final SysLoginService sysLoginService; private final SysLoginService sysLoginService;
private final CaptchaProperties captchaProperties;
@DubboReference @DubboReference
private RemoteClientService remoteClientService; private RemoteClientService remoteClientService;
/**
* 生成验证码
*/
@RateLimiter(time = 60, count = 10, limitType = LimitType.IP)
@GetMapping("/sso/getCaptcha")
public R<CaptchaVo> getCode() {
CaptchaVo captchaVo = new CaptchaVo();
boolean captchaEnabled = captchaProperties.getEnabled();
if (!captchaEnabled) {
captchaVo.setCaptchaEnabled(false);
return R.ok(captchaVo);
}
// 保存验证码信息
String uuid = IdUtil.simpleUUID();
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
// 生成验证码
CaptchaType captchaType = captchaProperties.getType();
boolean isMath = CaptchaType.MATH == captchaType;
Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
captcha.setGenerator(codeGenerator);
captcha.createCode();
// 如果是数学验证码使用SpEL表达式处理验证码结果
String code = captcha.getCode();
if (isMath) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
code = exp.getValue(String.class);
}
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
captchaVo.setUuid(uuid);
captchaVo.setImg(captcha.getImageBase64());
return R.ok(captchaVo);
}
/** /**
* SSO-Server端处理所有SSO相关请求 * SSO-Server端处理所有SSO相关请求
* http://{host}:{port}/sso/auth -- 单点登录授权地址接受参数redirect=授权重定向地址 * http://{host}:{port}/sso/auth -- 单点登录授权地址接受参数redirect=授权重定向地址
@ -65,9 +120,10 @@ public class SsoServerController {
return SaSsoServerProcessor.instance.dister(); return SaSsoServerProcessor.instance.dister();
} }
// @ApiEncrypt @ApiEncrypt
@PostMapping("/sso/doLogin") @PostMapping("/sso/doLogin")
public Object ssoDoLoginRequest(@RequestBody String body) { public Object ssoDoLoginRequest(@RequestBody String body) {
//todo 验证码提前验证额外加上限流
LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
// 授权类型和客户端id // 授权类型和客户端id

View File

@ -56,8 +56,35 @@ sa-token:
auth-url: http://localhost:5173/#/sso-login auth-url: http://localhost:5173/#/sso-login
active-timeout: 30 active-timeout: 30
# api接口加密
api-decrypt:
# 是否开启全局接口加密
enabled: true
# AES 加密头标识
headerFlag: encrypt-key
# 响应加密公钥 非对称算法的公私钥 如SM2RSA 使用者请自行更换
# 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ==
# 请求解密私钥 非对称算法的公私钥 如SM2RSA 使用者请自行更换
# 对应前端加密公钥 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y=
# ruoyi-security配置 # ruoyi-security配置
security: security:
captcha:
enabled: true
# 页面 <参数设置> 可开启关闭 验证码校验
# 验证码类型 math 数组计算 char 字符验证
type: MATH
# line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
category: CIRCLE
# 数字验证码位数
numberLength: 1
# 字符验证码长度
charLength: 4
# 排除路径 # 排除路径
excludes: excludes:
# 静态资源 # 静态资源

View File

@ -0,0 +1,17 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.vo.RemoteClientVo;
import org.dromara.system.saas.domain.vo.SysSaasClientVo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 客户端数据转换器
*
* @author Michelle.Chung
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasClientVoConvert extends BaseMapper<SysSaasClientVo, RemoteClientVo> {
}

View File

@ -0,0 +1,18 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.vo.RemoteDictDataVo;
import org.dromara.system.saas.domain.vo.SysSaasDictDataVo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 字典数据转换器
*
* @author zhujie
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasDictDataVoConvert extends BaseMapper<SysSaasDictDataVo, RemoteDictDataVo> {
}

View File

@ -0,0 +1,18 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
import org.dromara.system.saas.domain.bo.SysSaasLogininforBo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 登录日志转换器
*
* @author zhujie
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasLogininforBoConvert extends BaseMapper<RemoteLogininforBo, SysSaasLogininforBo> {
}

View File

@ -0,0 +1,27 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
import org.dromara.system.saas.domain.bo.SysSaasOperLogBo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 操作日志转换器
*
* @author zhujie
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasOperLogBoConvert extends BaseMapper<RemoteOperLogBo, SysSaasOperLogBo> {
/**
* RemoteOperLogBoToSysOperLogBo
*
* @param remoteOperLogBo 待转换对象
* @return 转换后对象
*/
@Mapping(target = "businessTypes", ignore = true)
SysSaasOperLogBo convert(RemoteOperLogBo remoteOperLogBo);
}

View File

@ -0,0 +1,17 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.bo.RemoteSocialBo;
import org.dromara.system.saas.domain.bo.SysSaasSocialBo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 社交数据转换器
*
* @author Michelle.Chung
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasSocialBoConvert extends BaseMapper<RemoteSocialBo, SysSaasSocialBo> {
}

View File

@ -0,0 +1,17 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.vo.RemoteSocialVo;
import org.dromara.system.saas.domain.vo.SysSaasSocialVo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 社交数据转换器
*
* @author Michelle.Chung
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasSocialVoConvert extends BaseMapper<SysSaasSocialVo, RemoteSocialVo> {
}

View File

@ -0,0 +1,18 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.vo.RemoteTenantVo;
import org.dromara.system.saas.domain.vo.SysSaasTenantVo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 租户转换器
*
* @author zhujie
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasTenantVoConvert extends BaseMapper<SysSaasTenantVo, RemoteTenantVo> {
}

View File

@ -0,0 +1,28 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.bo.RemoteUserBo;
import org.dromara.system.saas.domain.bo.SysSaasUserBo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 用户信息转换器
*
* @author zhujie
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasUserBoConvert extends BaseMapper<RemoteUserBo, SysSaasUserBo> {
/**
* RemoteUserBoToSysUserBo
*
* @param remoteUserBo 待转换对象
* @return 转换后对象
*/
@Mapping(target = "roleIds", ignore = true)
@Mapping(target = "postIds", ignore = true)
SysSaasUserBo convert(RemoteUserBo remoteUserBo);
}

View File

@ -0,0 +1,17 @@
package org.dromara.system.saas.domain.convert;
import io.github.linpeilie.BaseMapper;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.saas.domain.vo.SysSaasUserVo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;
/**
* 租户转换器
* @author zhujie
*/
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SysSaasUserVoConvert extends BaseMapper<SysSaasUserVo, RemoteUserVo> {
}

View File

@ -51,7 +51,7 @@ public class SysSaasClientServiceImpl implements ISysSaasClientService {
/** /**
* 查询客户端管理 * 查询客户端管理
*/ */
@Cacheable(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") @Cacheable(cacheNames = CacheNames.SYS_SAAS_CLIENT, key = "#clientId")
@Override @Override
public SysSaasClientVo queryByClientId(String clientId) { public SysSaasClientVo queryByClientId(String clientId) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysSaasClient>().eq(SysSaasClient::getClientId, clientId)); return baseMapper.selectVoOne(new LambdaQueryWrapper<SysSaasClient>().eq(SysSaasClient::getClientId, clientId));
@ -109,7 +109,7 @@ public class SysSaasClientServiceImpl implements ISysSaasClientService {
/** /**
* 修改客户端管理 * 修改客户端管理
*/ */
@CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#bo.clientId") @CacheEvict(cacheNames = CacheNames.SYS_SAAS_CLIENT, key = "#bo.clientId")
@Override @Override
public Boolean updateByBo(SysSaasClientBo bo) { public Boolean updateByBo(SysSaasClientBo bo) {
SysSaasClient update = MapstructUtils.convert(bo, SysSaasClient.class); SysSaasClient update = MapstructUtils.convert(bo, SysSaasClient.class);
@ -121,7 +121,7 @@ public class SysSaasClientServiceImpl implements ISysSaasClientService {
/** /**
* 修改状态 * 修改状态
*/ */
@CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") @CacheEvict(cacheNames = CacheNames.SYS_SAAS_CLIENT, key = "#clientId")
@Override @Override
public int updateUserStatus(String clientId, String status) { public int updateUserStatus(String clientId, String status) {
return baseMapper.update(null, return baseMapper.update(null,
@ -140,7 +140,7 @@ public class SysSaasClientServiceImpl implements ISysSaasClientService {
/** /**
* 批量删除客户端管理 * 批量删除客户端管理
*/ */
@CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true) @CacheEvict(cacheNames = CacheNames.SYS_SAAS_CLIENT, allEntries = true)
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) { if (isValid) {