From 6836c25ab446cfcdc038f5f26f4f94159435cb95 Mon Sep 17 00:00:00 2001
From: lroyia <814876716@qq.com>
Date: Tue, 10 May 2022 09:25:53 +0800
Subject: [PATCH] =?UTF-8?q?3.2.0=EF=BC=8CsaToken=E7=99=BB=E5=BD=95?=
=?UTF-8?q?=E7=89=88=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 9 +-
.../youfool/prj/common/util/StringUtils.java | 9 ++
.../youfool/prj/config/FilterConfig.java | 39 ------
.../youfool/prj/config/SaTokenConfig.java | 26 ++++
.../youfool/prj/config/SpringMvcConfig.java | 29 ++++
.../prj/controller/LoginController.java | 127 ++++++++++++++++++
.../prj/service/impl/StpInterfaceImpl.java | 31 +++++
src/main/resources/application-dev.yml | 21 +--
src/main/resources/application-prod.yml | 22 +--
src/main/resources/application.yml | 16 +++
10 files changed, 268 insertions(+), 61 deletions(-)
create mode 100644 src/main/java/com/chinaweal/youfool/prj/common/util/StringUtils.java
delete mode 100644 src/main/java/com/chinaweal/youfool/prj/config/FilterConfig.java
create mode 100644 src/main/java/com/chinaweal/youfool/prj/config/SaTokenConfig.java
create mode 100644 src/main/java/com/chinaweal/youfool/prj/config/SpringMvcConfig.java
create mode 100644 src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java
create mode 100644 src/main/java/com/chinaweal/youfool/prj/service/impl/StpInterfaceImpl.java
diff --git a/pom.xml b/pom.xml
index 11b5cf9..5c49a13 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,7 +40,7 @@
com.chinaweal.youfool
youfool-framework-springboot
- 3.0.2-SNAPSHOT
+ 3.2.0-SNAPSHOT
@@ -72,6 +72,13 @@
youfool-increpack-maven-plugin
2.1.0
+
+
+ mysql
+ mysql-connector-java
+ 8.0.28
+
+
diff --git a/src/main/java/com/chinaweal/youfool/prj/common/util/StringUtils.java b/src/main/java/com/chinaweal/youfool/prj/common/util/StringUtils.java
new file mode 100644
index 0000000..1d0e891
--- /dev/null
+++ b/src/main/java/com/chinaweal/youfool/prj/common/util/StringUtils.java
@@ -0,0 +1,9 @@
+package com.chinaweal.youfool.prj.common.util;
+
+/**
+ * 字符串工具类
+ * @author lroyia
+ * @since 2022/4/20 15:04
+ **/
+public abstract class StringUtils {
+}
diff --git a/src/main/java/com/chinaweal/youfool/prj/config/FilterConfig.java b/src/main/java/com/chinaweal/youfool/prj/config/FilterConfig.java
deleted file mode 100644
index 262a7aa..0000000
--- a/src/main/java/com/chinaweal/youfool/prj/config/FilterConfig.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.chinaweal.youfool.prj.config;
-
-import com.chinaweal.youfool.framework.springboot.filter.RepeatlyReadFilter;
-import com.chinaweal.youfool.framework.springboot.filter.RestLogFilter;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @author itluck
- */
-@Configuration
-public class FilterConfig {
- /**
- * 日志记录过滤器
- */
- @Bean
- public FilterRegistrationBean restLogFilter() {
- FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
- registrationBean.setFilter(new RestLogFilter());
- registrationBean.addUrlPatterns("/*");
- registrationBean.setName("restLogFilter");
- registrationBean.setOrder(-99);
- return registrationBean;
- }
-
- /**
- * 开启重复读取request流,用于日志
- */
- @Bean
- public FilterRegistrationBean repeatlyReadFilter() {
- FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
- registrationBean.setFilter(new RepeatlyReadFilter());
- registrationBean.addUrlPatterns("/*");
- registrationBean.setName("repeatlyReadFilter");
- registrationBean.setOrder(-100);
- return registrationBean;
- }
-}
diff --git a/src/main/java/com/chinaweal/youfool/prj/config/SaTokenConfig.java b/src/main/java/com/chinaweal/youfool/prj/config/SaTokenConfig.java
new file mode 100644
index 0000000..7e7310d
--- /dev/null
+++ b/src/main/java/com/chinaweal/youfool/prj/config/SaTokenConfig.java
@@ -0,0 +1,26 @@
+package com.chinaweal.youfool.prj.config;
+
+import cn.dev33.satoken.context.model.SaRequest;
+import cn.dev33.satoken.context.model.SaResponse;
+import cn.dev33.satoken.router.SaRouteFunction;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpUtil;
+
+/**
+ * SaToken权限与鉴权配置
+ * @author lroyia
+ * @since 2022/4/20 16:37
+ **/
+public class SaTokenConfig implements SaRouteFunction {
+
+ @Override
+ public void run(SaRequest request, SaResponse response, Object handler) {
+ // 根据路由划分模块,不同模块不同鉴权
+// SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
+// SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
+// SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
+// SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
+// SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
+// SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
+ }
+}
diff --git a/src/main/java/com/chinaweal/youfool/prj/config/SpringMvcConfig.java b/src/main/java/com/chinaweal/youfool/prj/config/SpringMvcConfig.java
new file mode 100644
index 0000000..4de6f3e
--- /dev/null
+++ b/src/main/java/com/chinaweal/youfool/prj/config/SpringMvcConfig.java
@@ -0,0 +1,29 @@
+package com.chinaweal.youfool.prj.config;
+
+import cn.dev33.satoken.interceptor.SaRouteInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * spring mvc 配置
+ * @author lroyia
+ * @since 2022/2/8 18:04
+ **/
+@Configuration
+public class SpringMvcConfig implements WebMvcConfigurer {
+
+ /**
+ * 拦截器注册
+ * @param registry 注册对象
+ * @author lroyia
+ * @since 2022年4月20日 16:41:54
+ */
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ // SaToken路由拦截与鉴权
+ registry.addInterceptor(new SaRouteInterceptor(new SaTokenConfig()))
+ .addPathPatterns("/**")
+ .excludePathPatterns("/user/auth/**");
+ }
+}
diff --git a/src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java b/src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java
new file mode 100644
index 0000000..8fa411d
--- /dev/null
+++ b/src/main/java/com/chinaweal/youfool/prj/controller/LoginController.java
@@ -0,0 +1,127 @@
+package com.chinaweal.youfool.prj.controller;
+
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpUtil;
+import com.chinaweal.youfool.framework.springboot.common.base.BaseController;
+import com.chinaweal.youfool.framework.springboot.common.util.AssertUtils;
+import com.chinaweal.youfool.framework.springboot.common.util.RSAUtil;
+import com.chinaweal.youfool.framework.springboot.rest.RestResult;
+import com.chinaweal.youfool.framework.springboot.rest.ResultCode;
+import com.chinaweal.youfool.framework.springboot.user.entity.LoginInfo;
+import com.chinaweal.youfool.framework.springboot.user.entity.UserBase;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 登录相关接口
+ *
+ * @author lroyia
+ * @since 2022/4/20 15:02
+ **/
+@Slf4j
+@RestController
+@RequestMapping("/user/auth")
+public class LoginController extends BaseController {
+
+ /**
+ * 登录接口
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @param encrypt 密码是否已经加密
+ * @return 登录结果
+ * @author lroyia
+ * @since 2022年4月20日 15:47:35
+ */
+ @PostMapping("login")
+ public RestResult> doLogin(String username, String password, Boolean encrypt) {
+ AssertUtils.isNotBlank(username, password);
+ if (encrypt != null && encrypt) {
+ String privateKey = getPrivateKey();
+ try {
+ password = RSAUtil.decrypt(password, privateKey);
+ } catch (Exception e) {
+ log.error("密码解密失败:{}", password, e);
+ return RestResult.error(ResultCode.BUSINESS_LOGIC_ERROR, "密码解密失败");
+ }
+ }
+
+ // TODO:与数据库匹配校验,具体按用户信息表
+
+ // 匹配成功的话,登记登录信息 TODO:这里的userId是用户唯一号,应根据实际的数据库信息进行替换
+ StpUtil.login("userId");
+ SaSession session = StpUtil.getSession();
+ // 将用户信息存储至session TODO:登录信息存到这里
+ UserBase userBase = new UserBase();
+ Set permissionSet = new HashSet<>();
+ permissionSet.add("admin");
+ userBase.setPermission(permissionSet);
+ session.set("user", userBase);
+
+ return RestResult.ok();
+ }
+
+ /**
+ * 获取当前持有的公钥
+ *
+ * @return 获取结果
+ * @author lroyia
+ * @since 2022年4月20日 15:55:13
+ */
+ @GetMapping("publicKey")
+ public RestResult getCurrentPublicKey() {
+ return RestResult.ok(getPublicKey());
+ }
+
+ /**
+ * 登录信息
+ *
+ * @return 状态判断
+ * @author lroyia
+ * @since 2022年4月20日 15:58:26
+ */
+ @GetMapping("login/info")
+ public RestResult> loginInfo() {
+ boolean login = StpUtil.isLogin();
+ SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
+ LoginInfo userInfo = new LoginInfo<>(login, null);
+ if (login) {
+ SaSession session = getSession();
+ userInfo.setUserInfo((UserBase) session.get("user"));
+ }
+ return RestResult.ok(userInfo);
+ }
+
+ /**
+ * 登出
+ *
+ * @return 操作结果
+ * @author lroyia
+ * @since 2022年4月20日 15:59:55
+ */
+ @GetMapping("logout")
+ public RestResult> logout() {
+ StpUtil.logout();
+ return RestResult.ok();
+ }
+
+ /**
+ * 列出用户权限信息
+ *
+ * @return 权限列表
+ * @author lroyia
+ * @since 2022年4月20日 16:12:09
+ */
+ @GetMapping("perm/list")
+ public RestResult> getPermList() {
+ return RestResult.ok(StpUtil.getPermissionList());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/chinaweal/youfool/prj/service/impl/StpInterfaceImpl.java b/src/main/java/com/chinaweal/youfool/prj/service/impl/StpInterfaceImpl.java
new file mode 100644
index 0000000..fbe15e4
--- /dev/null
+++ b/src/main/java/com/chinaweal/youfool/prj/service/impl/StpInterfaceImpl.java
@@ -0,0 +1,31 @@
+package com.chinaweal.youfool.prj.service.impl;
+
+import cn.dev33.satoken.stp.StpInterface;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 授权服务
+ * @author lroyia
+ * @since 2022/4/20 15:42
+ **/
+@Service
+public class StpInterfaceImpl implements StpInterface {
+ @Override
+ public List getPermissionList(Object loginId, String loginType) {
+ List permList = new ArrayList<>();
+ // TODO:利用loginId去数据库查询权限,并存到list中
+ // 如:List permList = userService.getPermList(loginId);
+ return permList;
+ }
+
+ @Override
+ public List getRoleList(Object loginId, String loginType) {
+ List roleList = new ArrayList<>();
+ // TODO:利用loginId去数据库查询用户角色,并存到list中
+ // 如:List roleList = userService.getRoleList(loginId);
+ return roleList;
+ }
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 6fddaad..482616f 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -2,19 +2,20 @@ logging:
level:
dao: debug
youfool.dao: info
- com.chinaweal.youfool.framework.springboot.cms: debug
- com.chinaweal.youfool.prj: debug
+ com.chinaweal.youfool.framework.springboot.log: debug
+ com.chinaweal.youfool.pms: debug
+ filePath: D:\project\pms\logs
spring:
datasource:
dynamic:
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/crgs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
+ url: jdbc:mysql://172.22.80.35:3306/crgs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
+ username: chinaweal
+ password: ChinaWeal2021
+ driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
youfool:
- url: jdbc:mysql://127.0.0.1:3306/aiccs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver
\ No newline at end of file
+ url: jdbc:mysql://172.22.80.35:3306/aiccs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
+ username: chinaweal
+ password: ChinaWeal2021
+ driver-class-name: com.mysql.cj.jdbc.Driver
\ No newline at end of file
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 8c276d8..257f5e1 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -1,21 +1,21 @@
logging:
level:
- dao: debug
+ dao: info
youfool.dao: info
- com.chinaweal.youfool.framework.springboot.log: debug
- com.chinaweal.youfool.pms: debug
+ com.chinaweal.youfool.framework.springboot.log: info
+ com.chinaweal.youfool.pms: info
filePath: D:\project\pms\logs
spring:
datasource:
dynamic:
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/crgs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
+ url: jdbc:mysql://172.22.80.35:3306/crgs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
+ username: chinaweal
+ password: ChinaWeal2021
+ driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
youfool:
- url: jdbc:mysql://127.0.0.1:3306/aiccs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver
\ No newline at end of file
+ url: jdbc:mysql://172.22.80.35:3306/aiccs?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=UTC
+ username: chinaweal
+ password: ChinaWeal2021
+ driver-class-name: com.mysql.cj.jdbc.Driver
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index ce56e54..b2d0892 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -69,3 +69,19 @@ knife4j:
server:
servlet:
context-path: /prj
+# Sa-Token配置
+sa-token:
+ # token名称 (同时也是cookie名称)
+ token-name: satoken
+ # token有效期,单位s 默认30天, -1代表永不过期
+ timeout: 2592000
+ # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
+ activity-timeout: -1
+ # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
+ is-concurrent: true
+ # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
+ is-share: false
+ # token风格
+ token-style: uuid
+ # 是否输出操作日志
+ is-log: false
\ No newline at end of file