mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-18 09:35:29 +08:00
sso server 登录
This commit is contained in:
parent
586942d623
commit
477daddedb
@ -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";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户账户
|
* 用户账户
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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}
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
<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>
|
||||||
@ -18,16 +18,6 @@
|
|||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
|
||||||
<groupId>com.alibaba.cloud</groupId>
|
|
||||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- SpringBoot Web依赖 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
@ -40,11 +30,55 @@
|
|||||||
<version>${revision}</version>
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- RuoYi Common Redis-->
|
<!-- 租户模块 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>ruoyi-common-redis</artifactId>
|
<artifactId>ruoyi-common-tenant</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 远程调用模块 TODO rename -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dromara</groupId>
|
||||||
|
<artifactId>ruoyi-api-system</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dromara</groupId>
|
||||||
|
<artifactId>ruoyi-common-log</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dromara</groupId>
|
||||||
|
<artifactId>ruoyi-common-ratelimiter</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>-->
|
||||||
|
<!-- <groupId>org.dromara</groupId>-->
|
||||||
|
<!-- <artifactId>ruoyi-common-security</artifactId>-->
|
||||||
|
<!-- <version>${revision}</version>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- SpringBoot Web依赖 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
|
<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.dev33</groupId>
|
<groupId>cn.dev33</groupId>
|
||||||
@ -57,10 +91,6 @@
|
|||||||
<artifactId>sa-token-jwt</artifactId>
|
<artifactId>sa-token-jwt</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- <dependency>-->
|
|
||||||
<!-- <groupId>com.github.ben-manes.caffeine</groupId>-->
|
|
||||||
<!-- <artifactId>caffeine</artifactId>-->
|
|
||||||
<!-- </dependency>-->
|
|
||||||
<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
|
<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.dev33</groupId>
|
<groupId>cn.dev33</groupId>
|
||||||
@ -86,26 +116,6 @@
|
|||||||
<version>1.38.0</version>
|
<version>1.38.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- <!– 安全模块 –>-->
|
|
||||||
<!-- <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 配置 -->
|
<!-- Apache Dubbo 配置 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.dubbo</groupId>
|
<groupId>org.apache.dubbo</groupId>
|
||||||
@ -124,38 +134,22 @@
|
|||||||
<artifactId>JustAuth</artifactId>
|
<artifactId>JustAuth</artifactId>
|
||||||
<version>1.16.6</version>
|
<version>1.16.6</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-log</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-ratelimiter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.hutool</groupId>
|
<groupId>cn.hutool</groupId>
|
||||||
<artifactId>hutool-captcha</artifactId>
|
<artifactId>hutool-captcha</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-social</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.dromara</groupId>
|
|
||||||
<artifactId>ruoyi-common-encrypt</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>org.apache.dubbo</groupId>-->
|
<!-- <groupId>org.apache.dubbo</groupId>-->
|
||||||
<!-- <artifactId>dubbo-metadata-report-redis</artifactId>-->
|
<!-- <artifactId>dubbo-metadata-report-redis</artifactId>-->
|
||||||
<!-- <exclusions>-->
|
<!-- <exclusions>-->
|
||||||
<!-- <exclusion>-->
|
<!-- <exclusion>-->
|
||||||
<!-- <groupId>redis.clients</groupId>-->
|
<!-- <groupId>redis.clients</groupId>-->
|
||||||
<!-- <artifactId>jedis</artifactId>-->
|
<!-- <artifactId>jedis</artifactId>-->
|
||||||
<!-- </exclusion>-->
|
<!-- </exclusion>-->
|
||||||
<!-- </exclusions>-->
|
<!-- </exclusions>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
# 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换
|
||||||
|
# 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=
|
||||||
|
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJnNwrj4hi/y3CCJu868ghCG5dUj8wZK++RNlTLcXoMmdZWEQ/u02RgD5LyLAXGjLOjbMtC+/J9qofpSGTKSx/MCAwEAAQ==
|
||||||
|
# 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换
|
||||||
|
# 对应前端加密公钥 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:
|
||||||
# 静态资源
|
# 静态资源
|
||||||
|
|||||||
@ -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> {
|
||||||
|
}
|
||||||
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
@ -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> {
|
||||||
|
}
|
||||||
@ -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> {
|
||||||
|
}
|
||||||
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
@ -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> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user