bean = new FilterRegistrationBean<>(new CorsFilter(source));
+ bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
+ return bean;
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/sso/GlobalExceptionHandler.java b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/config/GlobalExceptionHandler.java
similarity index 80%
rename from ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/sso/GlobalExceptionHandler.java
rename to ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/config/GlobalExceptionHandler.java
index 12e3ae848..a80c06c68 100644
--- a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/sso/GlobalExceptionHandler.java
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/config/GlobalExceptionHandler.java
@@ -1,4 +1,4 @@
-package com.pj.sso;
+package com.pj.config;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@@ -6,18 +6,18 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import cn.dev33.satoken.util.SaResult;
/**
- * 全局异常处理
+ * 全局异常处理
* @author click33
*
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
- // 全局异常拦截
+ // 全局异常拦截
@ExceptionHandler
public SaResult handlerException(Exception e) {
- e.printStackTrace();
+ e.printStackTrace();
return SaResult.error(e.getMessage());
}
-
+
}
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/config/SaTokenConfig.java b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/config/SaTokenConfig.java
new file mode 100644
index 000000000..02884e74b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/config/SaTokenConfig.java
@@ -0,0 +1,44 @@
+package com.pj.config;
+
+import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
+import cn.dev33.satoken.stp.StpInterface;
+import cn.dev33.satoken.stp.StpLogic;
+import org.dromara.common.core.factory.YmlPropertySourceFactory;
+import org.dromara.common.satoken.core.service.SaPermissionImpl;
+import org.dromara.common.satoken.handler.SaTokenExceptionHandler;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * sa-token 配置
+ *
+ * @author Lion Li
+ */
+@AutoConfiguration
+@PropertySource(value = "classpath:common-satoken.yml", factory = YmlPropertySourceFactory.class)
+public class SaTokenConfig {
+
+ @Bean
+ public StpLogic getStpLogicJwt() {
+ // Sa-Token 整合 jwt (简单模式)
+ return new StpLogicJwtForSimple();
+ }
+
+ /**
+ * 权限接口实现(使用bean注入方便用户替换)
+ */
+ @Bean
+ public StpInterface stpInterface() {
+ return new SaPermissionImpl();
+ }
+
+ /**
+ * 异常处理器
+ */
+ @Bean
+ public SaTokenExceptionHandler saTokenExceptionHandler() {
+ return new SaTokenExceptionHandler();
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/home/HomeController.java b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/controller/HomeController.java
similarity index 98%
rename from ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/home/HomeController.java
rename to ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/controller/HomeController.java
index 1be7c1d23..2b346ce6b 100644
--- a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/home/HomeController.java
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/controller/HomeController.java
@@ -1,4 +1,4 @@
-package com.pj.home;
+package com.pj.controller;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil;
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/sso/SsoServerController.java b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/controller/SsoServerController.java
similarity index 64%
rename from ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/sso/SsoServerController.java
rename to ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/controller/SsoServerController.java
index 9c4c1773d..ae786e4a8 100644
--- a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/sso/SsoServerController.java
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/controller/SsoServerController.java
@@ -1,13 +1,9 @@
-package com.pj.sso;
+package com.pj.controller;
-import cn.dev33.satoken.context.SaHolder;
-import cn.dev33.satoken.context.model.SaRequest;
-import cn.dev33.satoken.sign.SaSignUtil;
import cn.dev33.satoken.sso.config.SaSsoServerConfig;
import cn.dev33.satoken.sso.processor.SaSsoServerProcessor;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
-import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.pj.model.vo.LoginVo;
import com.pj.model.vo.SysClientVo;
@@ -35,16 +31,6 @@ public class SsoServerController {
*/
@RequestMapping("/sso/*")
public Object ssoRequest() {
- // 如果登录时没有提供redirect参数,则进入平台中心首页 /home,而不是重定向到 client 端
- SaRequest req = SaHolder.getRequest();
- if(req.isPath("/sso/auth") && !req.hasParam("redirect") && StpUtil.isLogin()) {
- return SaHolder.getResponse().redirect("/home");
- }
-
- if(req.isPath("/sso/isLogin")) {
- return SaResult.data(StpUtil.isLogin());
- }
-
return SaSsoServerProcessor.instance.dister();
}
@@ -61,7 +47,6 @@ public class SsoServerController {
ssoServer.doLoginHandle = (name, pwd) -> {
// 此处仅做模拟登录,真实环境应该查询数据进行登录
if("sa".equals(name) && "123456".equals(pwd)) {
- StpUtil.login(10001);
PasswordLoginBody body = new PasswordLoginBody();
body.setUsername("sa");
body.setPassword("123456");
@@ -71,12 +56,16 @@ public class SsoServerController {
body.setCode("code1");
body.setUuid("qweqw");
-
-
SysClientVo client = new SysClientVo();
client.setId(1L);
- client.setTimeout(10000L);
- client.setActiveTimeout(1000000L);
+ client.setClientId("ClientId1");
+ client.setClientKey("setClientKey");
+ client.setClientSecret("setClientSecret");
+ client.setGrantType("password");
+ client.setDeviceType("pc");
+ client.setActiveTimeout(604800L);
+ client.setTimeout(604800L);
+ client.setStatus("0");
LoginVo loginVo = IAuthStrategy.login(JSONUtil.toJsonStr(body), client, body.getGrantType());
@@ -87,22 +76,4 @@ public class SsoServerController {
}
- // 示例:获取数据接口(用于在模式三下,为 client 端开放拉取数据的接口)
- @RequestMapping("/sso/getData")
- public SaResult getData(String apiType, String loginId) {
- System.out.println("---------------- 获取数据 ----------------");
- System.out.println("apiType=" + apiType);
- System.out.println("loginId=" + loginId);
-
- // 校验签名:只有拥有正确秘钥发起的请求才能通过校验
- SaSignUtil.checkRequest(SaHolder.getRequest());
-
- // 自定义返回结果(模拟)
- return SaResult.ok()
- .set("id", loginId)
- .set("name", "LinXiaoYu")
- .set("sex", "女")
- .set("age", 18);
- }
-
}
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/h5/H5Controller.java b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/h5/H5Controller.java
deleted file mode 100644
index 4c54e8fd0..000000000
--- a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/h5/H5Controller.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.pj.h5;
-
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import cn.dev33.satoken.sso.util.SaSsoConsts;
-import cn.dev33.satoken.sso.template.SaSsoUtil;
-import cn.dev33.satoken.stp.StpUtil;
-import cn.dev33.satoken.util.SaFoxUtil;
-import cn.dev33.satoken.util.SaResult;
-
-/**
- * 前后台分离架构下集成SSO所需的代码 (SSO-Server端)
- * (注:如果不需要前后端分离架构下集成SSO,可删除此包下所有代码)
- * @author click33
- *
- */
-@RestController
-public class H5Controller {
-
- /**
- * 获取 redirectUrl
- */
- @RequestMapping("/sso/getRedirectUrl")
- public SaResult getRedirectUrl(String redirect, String mode, String client) {
- // 未登录情况下,返回 code=401
- if(!StpUtil.isLogin()) {
- return SaResult.code(401);
- }
- // 已登录情况下,构建 redirectUrl
- redirect = SaFoxUtil.decoderUrl(redirect);
- if(SaSsoConsts.MODE_SIMPLE.equals(mode)) {
- // 模式一
- SaSsoUtil.checkRedirectUrl(redirect);
- return SaResult.data(redirect);
- } else {
- // 模式二或模式三
- String redirectUrl = SaSsoUtil.buildRedirectUrl(StpUtil.getLoginId(), client, redirect);
- return SaResult.data(redirectUrl);
- }
- }
-
-}
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/helper/LoginHelper.java b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/helper/LoginHelper.java
new file mode 100644
index 000000000..f1339facd
--- /dev/null
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/helper/LoginHelper.java
@@ -0,0 +1,202 @@
+//package com.pj.utils;
+//
+//import cn.dev33.satoken.session.SaSession;
+//import cn.dev33.satoken.stp.SaLoginModel;
+//import cn.dev33.satoken.stp.StpUtil;
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.convert.Convert;
+//import cn.hutool.core.util.ObjectUtil;
+//import lombok.AccessLevel;
+//import lombok.NoArgsConstructor;
+//import org.dromara.common.core.constant.TenantConstants;
+//import org.dromara.common.core.constant.UserConstants;
+//import org.dromara.common.core.domain.model.LoginUser;
+//import org.dromara.common.core.enums.UserType;
+//
+//import java.util.Set;
+//
+///**
+// * 登录鉴权助手
+// *
+// * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app
+// * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios
+// * 可以组成 用户类型与设备类型多对多的 权限灵活控制
+// *
+// * 多用户体系 针对 多种用户类型 但权限控制不一致
+// * 可以组成 多用户类型表与多设备类型 分别控制权限
+// *
+// * @author Lion Li
+// */
+//@NoArgsConstructor(access = AccessLevel.PRIVATE)
+//public class LoginHelper {
+//
+// public static final String LOGIN_USER_KEY = "loginUser";
+// public static final String TENANT_KEY = "tenantId";
+// public static final String USER_KEY = "userId";
+// public static final String USER_NAME_KEY = "userName";
+// public static final String DEPT_KEY = "deptId";
+// public static final String DEPT_NAME_KEY = "deptName";
+// public static final String DEPT_CATEGORY_KEY = "deptCategory";
+// public static final String CLIENT_KEY = "clientid";
+//
+// /**
+// * 登录系统 基于 设备类型
+// * 针对相同用户体系不同设备
+// *
+// * @param loginUser 登录用户信息
+// * @param model 配置参数
+// */
+// public static void login(LoginUser loginUser, SaLoginModel model) {
+// model = ObjectUtil.defaultIfNull(model, new SaLoginModel());
+// StpUtil.login(loginUser.getLoginId(),
+// model.setExtra(TENANT_KEY, loginUser.getTenantId())
+// .setExtra(USER_KEY, loginUser.getUserId())
+// .setExtra(USER_NAME_KEY, loginUser.getUsername())
+// .setExtra(DEPT_KEY, loginUser.getDeptId())
+// .setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
+// .setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
+// );
+// StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
+// }
+//
+// /**
+// * 获取用户(多级缓存)
+// */
+// public static LoginUser getLoginUser() {
+// SaSession session = StpUtil.getTokenSession();
+// if (ObjectUtil.isNull(session)) {
+// return null;
+// }
+// return (LoginUser) session.get(LOGIN_USER_KEY);
+// }
+//
+// /**
+// * 获取用户基于token
+// */
+// public static LoginUser getLoginUser(String token) {
+// SaSession session = StpUtil.getTokenSessionByToken(token);
+// if (ObjectUtil.isNull(session)) {
+// return null;
+// }
+// return (LoginUser) session.get(LOGIN_USER_KEY);
+// }
+//
+// /**
+// * 获取用户id
+// */
+// public static Long getUserId() {
+// return Convert.toLong(getExtra(USER_KEY));
+// }
+//
+// /**
+// * 获取用户账户
+// */
+// public static String getUsername() {
+// return Convert.toStr(getExtra(USER_NAME_KEY));
+// }
+//
+// /**
+// * 获取租户ID
+// */
+// public static String getTenantId() {
+// return Convert.toStr(getExtra(TENANT_KEY));
+// }
+//
+// /**
+// * 获取部门ID
+// */
+// public static Long getDeptId() {
+// return Convert.toLong(getExtra(DEPT_KEY));
+// }
+//
+// /**
+// * 获取部门名
+// */
+// public static String getDeptName() {
+// return Convert.toStr(getExtra(DEPT_NAME_KEY));
+// }
+//
+// /**
+// * 获取部门类别编码
+// */
+// public static String getDeptCategory() {
+// return Convert.toStr(getExtra(DEPT_CATEGORY_KEY));
+// }
+//
+// /**
+// * 获取当前 Token 的扩展信息
+// *
+// * @param key 键值
+// * @return 对应的扩展数据
+// */
+// private static Object getExtra(String key) {
+// try {
+// return StpUtil.getExtra(key);
+// } catch (Exception e) {
+// return null;
+// }
+// }
+//
+// /**
+// * 获取用户类型
+// */
+// public static UserType getUserType() {
+// String loginType = StpUtil.getLoginIdAsString();
+// return UserType.getUserType(loginType);
+// }
+//
+// /**
+// * 是否为超级管理员
+// *
+// * @param userId 用户ID
+// * @return 结果
+// */
+// public static boolean isSuperAdmin(Long userId) {
+// return UserConstants.SUPER_ADMIN_ID.equals(userId);
+// }
+//
+// /**
+// * 是否为超级管理员
+// *
+// * @return 结果
+// */
+// public static boolean isSuperAdmin() {
+// return isSuperAdmin(getUserId());
+// }
+//
+// /**
+// * 是否为租户管理员
+// *
+// * @param rolePermission 角色权限标识组
+// * @return 结果
+// */
+// public static boolean isTenantAdmin(Set rolePermission) {
+// if (CollUtil.isEmpty(rolePermission)) {
+// return false;
+// }
+// return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY);
+// }
+//
+// /**
+// * 是否为租户管理员
+// *
+// * @return 结果
+// */
+// public static boolean isTenantAdmin() {
+// return Convert.toBool(isTenantAdmin(getLoginUser().getRolePermission()));
+// }
+//
+// /**
+// * 检查当前用户是否已登录
+// *
+// * @return 结果
+// */
+// public static boolean isLogin() {
+// try {
+// return getLoginUser() != null;
+// } catch (Exception e) {
+// return false;
+// }
+// }
+//
+//}
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/service/impl/PasswordAuthStrategy.java b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/service/impl/PasswordAuthStrategy.java
index 6b5280426..7fdab746d 100644
--- a/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/service/impl/PasswordAuthStrategy.java
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/java/com/pj/service/impl/PasswordAuthStrategy.java
@@ -77,7 +77,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
loginUser.setDeptId(2L);
loginUser.setUsername("测试用户登录名");
loginUser.setNickname("测试用户名称");
- loginUser.setUserType("用户类型1");
+ loginUser.setUserType("app_user");
return loginUser;
}
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/resources/application.yml b/ruoyi-modules/ruoyi-sso-server/src/main/resources/application.yml
index 6dd14e176..0d2a009ff 100644
--- a/ruoyi-modules/ruoyi-sso-server/src/main/resources/application.yml
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/resources/application.yml
@@ -1,6 +1,6 @@
# 端口
server:
- port: 9002
+ port: 9000
spring:
cloud:
@@ -42,6 +42,8 @@ spring:
sa-token:
# token名称 (同时也是cookie名称)
token-name: Authorization
+ # cookie写入
+ is-read-cookie: true
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
@@ -74,4 +76,3 @@ security:
- /*/api-docs
- /*/api-docs/**
-
\ No newline at end of file
diff --git a/ruoyi-modules/ruoyi-sso-server/src/main/resources/static/sa-res/login.js b/ruoyi-modules/ruoyi-sso-server/src/main/resources/static/sa-res/login.js
index 80a0acd45..c14744ef8 100644
--- a/ruoyi-modules/ruoyi-sso-server/src/main/resources/static/sa-res/login.js
+++ b/ruoyi-modules/ruoyi-sso-server/src/main/resources/static/sa-res/login.js
@@ -1,15 +1,11 @@
-// sa
+// sa
var sa = {};
-sa.setToken = function (token) {
- localStorage.setItem("Authorization", token)
-};
-sa.getToken = function () {
- return "Bearer " + localStorage.getItem("Authorization")
-};
-
-$.ajaxSettings.beforeSend = function (xhr, request) {
- xhr.setRequestHeader("Authorization", sa.getToken());
+function setCookie(cname, cvalue, exdays) {
+ var d = new Date();
+ d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
+ var expires = "expires=" + d.toGMTString();
+ document.cookie = cname + "=" + cvalue + "; " + expires;
}
// 打开loading
@@ -24,28 +20,6 @@ sa.hideLoading = function () {
};
-$.ajax({
- url: "sso/isLogin",
- type: "get",
- success: function (res) {
- debugger
- console.log('返回数据:', res);
- sa.hideLoading();
- if (res.code === 200 && res.data) {
- layer.msg('登录成功', {anim: 0, icon: 6});
- } else {
- layer.msg("检验未登录!", {anim: 6, icon: 2});
- }
- },
- error: function (xhr, type, errorThrown) {
- sa.hideLoading();
- if (xhr.status == 0) {
- return layer.alert('无法连接到服务器,请检查网络');
- }
- return layer.alert("异常:" + JSON.stringify(xhr));
- }
-});
-
// ----------------------------------- 登录事件 -----------------------------------
$('.login-btn').click(function () {
@@ -63,9 +37,9 @@ $('.login-btn').click(function () {
success: function (res) {
console.log('返回数据:', res);
sa.hideLoading();
- if (res.code === 200) {
+ if (res.code == 200) {
layer.msg('登录成功', {anim: 0, icon: 6});
- sa.setToken(res.data);
+ setCookie("Authorization", "Bearer " + res.data, 1);
setTimeout(function () {
location.reload();
}, 800)
@@ -94,6 +68,6 @@ $('[name=name],[name=pwd]').bind('keypress', function (event) {
// 输入框获取焦点
$("[name=name]").focus();
-// 打印信息
+// 打印信息
var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/";
console.log(str);
diff --git a/ruoyi-modules/ruoyi-system-saas/pom.xml b/ruoyi-modules/ruoyi-system-saas/pom.xml
index f46d7794a..9b4ecac4d 100644
--- a/ruoyi-modules/ruoyi-system-saas/pom.xml
+++ b/ruoyi-modules/ruoyi-system-saas/pom.xml
@@ -16,29 +16,6 @@
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-discovery
-
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-config
-
-
-
-
- org.springframework.cloud
- spring-cloud-starter-bootstrap
-
-
-
org.dromara
diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml
index 022a04c47..0fc6d5513 100644
--- a/ruoyi-modules/ruoyi-system/pom.xml
+++ b/ruoyi-modules/ruoyi-system/pom.xml
@@ -16,29 +16,6 @@
-
- org.springframework.boot
- spring-boot-starter-actuator
-
-
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-discovery
-
-
-
- com.alibaba.cloud
- spring-cloud-starter-alibaba-nacos-config
-
-
-
-
- org.springframework.cloud
- spring-cloud-starter-bootstrap
-
-
-
org.dromara