From 8f63d5ce747106195b279e1c158fd12f9997a770 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 18 三月 2025 19:08:40 +0800
Subject: [PATCH] 检验任务代码迁移&爱尚平台对接测试
---
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java | 20
ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java | 40 ++
ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java | 20 +
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java | 46 +++
notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java | 3
ruoyi-admin/src/main/resources/application.yml | 12
notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java | 81 +++++
ruoyi-common/pom.xml | 6
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java | 18
cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java | 4
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java | 208 +++++++++++++
ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java | 42 ++
ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java | 63 ++++
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java | 35 ++
inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java | 51 +++
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java | 10
inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java | 3
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java | 6
ruoyi-admin/src/main/resources/i18n/messages.properties | 71 ++--
ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java | 37 +
ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java | 3
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java | 26 +
ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java | 37 ++
23 files changed, 767 insertions(+), 75 deletions(-)
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java
index 5215778..6db6457 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java
@@ -160,7 +160,7 @@
}
@ApiOperation(value = "閫氳繃椤圭洰鑾峰彇璁惧鍒楄〃")
- @PostMapping("/selectDeviceByCategory")
+ @GetMapping("/selectDeviceByCategory")
public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String sonLaboratory) {
return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass,sonLaboratory));
}
@@ -192,7 +192,7 @@
@ApiOperation(value = "鍒ゆ柇璇ヨ澶囨槸鍚﹀彲浠ユ暟閲�")
@GetMapping("/determineWhetherToCollectData")
- public Result<?> determineWhetherToCollectData(@RequestParam("managementNumber") String managementNumber, HttpServletRequest request) {
+ public Result<?> determineWhetherToCollectData(String managementNumber, HttpServletRequest request) {
return deviceService.determineWhetherToCollectData(managementNumber, request);
}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
index d33fb46..8e0992f 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
@@ -102,8 +102,8 @@
@ApiOperation(value = "浜ゆ帴鎸夐挳")
@PostMapping("/upPlanUser")
- public Result<?> upPlanUser(Integer userId, Integer orderId, String sonLaboratory) {
- return Result.success(insOrderPlanService.upPlanUser(userId, orderId, sonLaboratory));
+ public Result<?> upPlanUser(@RequestBody UpInsOrderDTO upInsOrderDTO) {
+ return Result.success(insOrderPlanService.upPlanUser(upInsOrderDTO.getUserId(), upInsOrderDTO.getOrderId(), upInsOrderDTO.getSonLaboratory()));
}
@ApiOperation(value = "鍒ゆ柇浜ゆ帴鐨勮瘯楠屽")
@@ -142,18 +142,18 @@
}
/**
- * @param param 妯℃澘鍐呭
- * @param currentTable 褰撳墠妯℃澘id
- * @param sampleId 褰撳墠鏍峰搧id
- * @param orderId 褰撳墠璁㈠崟id
- * @param sonLaboratory 瀛愯瘯楠屽
+ * @param inspectionOrderDTO 妫�楠屾暟鎹�
* @return
*/
@ApiOperation(value = "淇濆瓨妫�楠屽唴瀹�")
@PostMapping("/saveInsContext")
- public Result<?> saveInsContext(String param, Integer currentTable, Integer sampleId, Integer orderId, String sonLaboratory,Boolean isDelete) {
- Map<String, Object> param2 = JSON.parseObject(param, Map.class);
- insOrderPlanService.saveInsContext(param2, currentTable, sampleId, orderId, sonLaboratory,isDelete);
+ public Result<?> saveInsContext(@RequestBody InspectionOrderDTO inspectionOrderDTO) {
+ insOrderPlanService.saveInsContext(inspectionOrderDTO.getParam(),
+ inspectionOrderDTO.getCurrentTable(),
+ inspectionOrderDTO.getSampleId(),
+ inspectionOrderDTO.getOrderId(),
+ inspectionOrderDTO.getSonLaboratory(),
+ inspectionOrderDTO.getIsDelete());
return Result.success();
}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java
new file mode 100644
index 0000000..432a612
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java
@@ -0,0 +1,51 @@
+package com.ruoyi.inspect.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 妫�楠屼繚瀛樻暟鎹紶杈撳璞to
+ */
+@Data
+public class InspectionOrderDTO implements Serializable {
+
+ /**
+ * 妫�楠屽弬鏁�
+ */
+ @ApiModelProperty("妫�楠屽弬鏁�")
+ private Map<String, Object> param;
+
+ /**
+ * 褰撳墠妯℃澘id
+ */
+ @ApiModelProperty("褰撳墠妯℃澘id")
+ private Integer currentTable;
+
+ /**
+ * 鏍峰搧id
+ */
+ @ApiModelProperty("鏍峰搧id")
+ private Integer sampleId;
+
+ /**
+ * 璁㈠崟id
+ */
+ @ApiModelProperty("璁㈠崟id")
+ private Integer orderId;
+
+ /**
+ * 瀛愬疄楠屽
+ */
+ @ApiModelProperty("瀛愬疄楠屽")
+ private String sonLaboratory;
+
+ /**
+ * 鏄惁鍒犻櫎
+ */
+ @ApiModelProperty("鏄惁鍒犻櫎")
+ private Boolean isDelete;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java
index c8da5f7..47d047b 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java
@@ -24,4 +24,7 @@
@ApiModelProperty(value = "瀛愯瘯楠屽")
private String sonLaboratory;
+ @ApiModelProperty("浜ゆ帴浜哄憳id")
+ private Integer userId;
+
}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java
index ed22a65..13230c6 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java
@@ -49,13 +49,13 @@
List<SampleProductDto3> selectSampleProductListByOrderId3(@Param("ids") List<Integer> ids);
- List<SampleProductDto> getInsOrderAndSample(Integer id, String laboratory);
+ List<SampleProductDto> getInsOrderAndSample(@Param("id")Integer id, @Param("laboratory")String laboratory);
String getSampleEn(String sample);
- List<InsProduct> getInsProduct1(Integer id, String laboratory);
+ List<InsProduct> getInsProduct1(@Param("id") Integer id, @Param("laboratory") String laboratory);
- List<InsProduct> getInsProduct5(Integer id, String laboratory);
+ List<InsProduct> getInsProduct5(@Param("id") Integer id, @Param("laboratory") String laboratory);
List<InsProduct> getInsProduct2(@Param("id") Integer id, @Param("sonLaboratory") String sonLaboratory);
diff --git a/notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java b/notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java
new file mode 100644
index 0000000..031ef9e
--- /dev/null
+++ b/notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java
@@ -0,0 +1,81 @@
+package com.ruoyi.notice.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.notice.pojo.InformationNotification;
+import com.ruoyi.notice.service.InformationNotificationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 娑堟伅閫氱煡 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-04-23 02:14:30
+ */
+@Api(tags = "娑堟伅閫氱煡")
+@RestController
+@RequestMapping("/informationNotification")
+public class InformationNotificationController {
+
+ @Autowired
+ private InformationNotificationService informationNotificationService;
+
+ @ApiOperation(value = "娑堟伅閫氱煡-婊氬姩鍒嗛〉鏌ヨ")
+ @GetMapping("page")
+ public Result<?> getPage(Long size, Long current, String messageType) {
+ return Result.success(informationNotificationService.getPage(new Page<>(current, size), messageType));
+ }
+
+ @ApiOperation(value = "娑堟伅閫氱煡-鏇存柊娑堟伅鐘舵�侊紙鎷掔粷銆佹帴鏀讹級")
+ @PutMapping("updateMessageStatus")
+ @Log(title = "娑堟伅閫氱煡", businessType = BusinessType.UPDATE)
+ public Result<?> updateMessageStatus(@RequestBody InformationNotification informationNotification) {
+ informationNotificationService.updateById(informationNotification);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "娑堟伅閫氱煡-鏍囪鎵�鏈変俊鎭负宸茶/鍒犻櫎鎵�鏈夊凡璇绘秷鎭�")
+ @PutMapping("informationReadOrDelete/{isMarkAllInformationRead}")
+ public Result<?> markAllInformationReadOrDeleteAllReadMessages(@PathVariable("isMarkAllInformationRead") Boolean isMarkAllInformationRead) {
+ informationNotificationService.markAllInformationReadOrDeleteAllReadMessages(isMarkAllInformationRead);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "娑堟伅閫氱煡-鍒犻櫎鏁版嵁")
+ @DeleteMapping("deleteDataBasedOnId")
+ @Log(title = "娑堟伅閫氱煡", businessType = BusinessType.DELETE)
+ public Result<?> deleteDataBasedOnId(Integer id) {
+ informationNotificationService.removeById(id);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "娑堟伅閫氱煡-鏌ヨ鏄惁瀛樺湪鏈鏁版嵁")
+ @GetMapping("checkForUnreadData")
+ public Result<?> checkForUnreadData() {
+ return Result.success(informationNotificationService.checkForUnreadData());
+ }
+
+ @ApiOperation(value = "娑堟伅閫氱煡-鐐瑰嚮璇︽儏瑙﹀彂淇敼鐘舵�佷负宸茶")
+ @PutMapping("triggerModificationStatusToRead/{id}")
+ @Log(title = "娑堟伅閫氱煡", businessType = BusinessType.UPDATE)
+ public Result<?> triggerModificationStatusToRead(@PathVariable("id") Integer id) {
+ informationNotificationService.triggerModificationStatusToRead(id);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "娑堟伅閫氱煡-鑾峰彇棣栭〉鍥涚娑堟伅鏁伴噺")
+ @GetMapping("getNumberFourTypesMessagesHomePage")
+ public Result<?> getNumberFourTypesMessagesHomePage() {
+ Map<String, Object> data = informationNotificationService.getNumberFourTypesMessagesHomePage();
+ return Result.success(data);
+ }
+}
diff --git a/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java b/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java
index 50525b8..6ce4c80 100644
--- a/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java
+++ b/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java
@@ -6,6 +6,7 @@
import com.ruoyi.notice.dto.InformationNotificationDto;
import com.ruoyi.notice.pojo.InformationNotification;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
/**
* <p>
@@ -18,5 +19,5 @@
@Mapper
public interface InformationNotificationMapper extends BaseMapper<InformationNotification> {
- IPage<InformationNotificationDto> getPage(Page page, String messageType, Integer userId);
+ IPage<InformationNotificationDto> getPage(Page page, @Param("messageType") String messageType, @Param("userId")Integer userId);
}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
index f61208e..30c7a70 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
@@ -67,6 +67,16 @@
}
/**
+ * 鏍规嵁瀛楀吀鍚嶇О鏌ヨ瀛楀吀鏁版嵁
+ */
+ @PreAuthorize("@ss.hasPermi('system:dict:query')")
+ @GetMapping(value = "/selectDictDataByName/{dictName}")
+ public AjaxResult selectDictDataByName(@PathVariable String dictName)
+ {
+ return success(dictTypeService.selectDictDataByName(dictName));
+ }
+
+ /**
* 鏂板瀛楀吀绫诲瀷
*/
@PreAuthorize("@ss.hasPermi('system:dict:add')")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 73768ba..19000a3 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -2,7 +2,9 @@
import java.util.List;
import java.util.Set;
+import java.util.UUID;
+import com.ruoyi.common.config.SsoBean;
import com.ruoyi.common.core.vo.SysUserVO;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +46,9 @@
@Autowired
private UserMapper userMapper;
+
+ @Autowired
+ private SsoBean ssoBean;
/**
* 鐧诲綍鏂规硶
@@ -103,4 +108,34 @@
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus));
}
+
+
+ /**
+ * 鑾峰彇缁熶竴鐧诲綍骞冲彴鑾峰彇CODE鍦板潃
+ *
+ * @return
+ */
+
+ @GetMapping("/getSsoAuthUrl")
+ public AjaxResult getSsoAuthUrl() {
+ String uuid = UUID.randomUUID().toString();
+ return AjaxResult.success("鎿嶄綔鎴愬姛", ssoBean.getUrl() + "/oauth2/auth?response_type=code&scope=openid&client_id=" + ssoBean.getClientId() + "&redirect_uri=" + ssoBean.getCallbackUrl() + "&state=" + uuid);
+ }
+
+ /**
+ * 鍗曠偣鐧诲綍
+ *
+ * @param code 鐧诲綍淇℃伅
+ * @return 缁撴灉
+ */
+ @PostMapping("/loginBySSO")
+ public AjaxResult loginBySSO(String code)
+ {
+ AjaxResult ajax = AjaxResult.success();
+ // 鐢熸垚浠ょ墝
+ String token = loginService.loginBySSO(code);
+ ajax.put(Constants.TOKEN, token);
+ return ajax;
+ }
+
}
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 482ab87..5812b05 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -36,6 +36,7 @@
level:
com.ruoyi: debug
org.springframework: warn
+ com.deepoove: off #鍏抽棴poi-tl鏃ュ織
# 鐢ㄦ埛閰嶇疆
user:
@@ -47,6 +48,11 @@
# Spring閰嶇疆
spring:
+ jackson: # 鍏ㄥ眬鏃堕棿澶勭悊 LocalDateTime鏃堕棿搴忓垪鍙�
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+ serialization:
+ write-dates-as-timestamps: false
#rabbitmq閰嶇疆
rabbitmq:
host: 127.0.0.1
@@ -145,3 +151,9 @@
cache-enabled: false
log-impl: # org.apache.ibatis.logging.stdout.StdOutImpl
+#闆嗗洟缁熶竴鐧诲綍
+sso:
+ url: https://ztt-sso.asuncloud.net
+ clientId: 47ded514-f447-43b4-afdf-181c10e2222d
+ clientSecret: ea93d26a68863da5d71a6e3355ec22df
+ callbackUrl: https://ztzb-lims.ztt.cn/thirdpartylogin
diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties
index 93de005..b182920 100644
--- a/ruoyi-admin/src/main/resources/i18n/messages.properties
+++ b/ruoyi-admin/src/main/resources/i18n/messages.properties
@@ -1,38 +1,41 @@
-#閿欒娑堟伅
-not.null=* 蹇呴』濉啓
-user.jcaptcha.error=楠岃瘉鐮侀敊璇�
-user.jcaptcha.expire=楠岃瘉鐮佸凡澶辨晥
-user.not.exists=鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒
-user.password.not.match=鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒
-user.password.retry.limit.count=瀵嗙爜杈撳叆閿欒{0}娆�
-user.password.retry.limit.exceed=瀵嗙爜杈撳叆閿欒{0}娆★紝甯愭埛閿佸畾{1}鍒嗛挓
-user.password.delete=瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿宸茶鍒犻櫎
-user.blocked=鐢ㄦ埛宸插皝绂侊紝璇疯仈绯荤鐞嗗憳
-role.blocked=瑙掕壊宸插皝绂侊紝璇疯仈绯荤鐞嗗憳
-login.blocked=寰堥仐鎲撅紝璁块棶IP宸茶鍒楀叆绯荤粺榛戝悕鍗�
-user.logout.success=閫�鍑烘垚鍔�
+#\u9519\u8BEF\u6D88\u606F
+not.null=* \u5FC5\u987B\u586B\u5199
+user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF
+user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548
+user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF
+user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF
+user.sso.not.match=\u5355\u70B9\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25
+user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21
+user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F
+user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664
+user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
+role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
+login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355
+user.logout.success=\u9000\u51FA\u6210\u529F
+user.sso.logout.success=\u5355\u70B9\u767B\u5F55\u9000\u51FA\u6210\u529F
-length.not.valid=闀垮害蹇呴』鍦▄min}鍒皗max}涓瓧绗︿箣闂�
+length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4
-user.username.not.valid=* 2鍒�20涓眽瀛椼�佸瓧姣嶃�佹暟瀛楁垨涓嬪垝绾跨粍鎴愶紝涓斿繀椤讳互闈炴暟瀛楀紑澶�
-user.password.not.valid=* 5-50涓瓧绗�
-
-user.email.not.valid=閭鏍煎紡閿欒
-user.mobile.phone.number.not.valid=鎵嬫満鍙锋牸寮忛敊璇�
-user.login.success=鐧诲綍鎴愬姛
-user.register.success=娉ㄥ唽鎴愬姛
-user.notfound=璇烽噸鏂扮櫥褰�
-user.forcelogout=绠$悊鍛樺己鍒堕��鍑猴紝璇烽噸鏂扮櫥褰�
-user.unknown.error=鏈煡閿欒锛岃閲嶆柊鐧诲綍
+user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934
+user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26
-##鏂囦欢涓婁紶娑堟伅
-upload.exceed.maxSize=涓婁紶鐨勬枃浠跺ぇ灏忚秴鍑洪檺鍒剁殑鏂囦欢澶у皬锛�<br/>鍏佽鐨勬枃浠舵渶澶уぇ灏忔槸锛歿0}MB锛�
-upload.filename.exceed.length=涓婁紶鐨勬枃浠跺悕鏈�闀縶0}涓瓧绗�
+user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF
+user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF
+user.login.success=\u767B\u5F55\u6210\u529F
+user.sso.login.success=\u5355\u70B9\u767B\u5F55\u6210\u529F
+user.register.success=\u6CE8\u518C\u6210\u529F
+user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55
+user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55
+user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55
-##鏉冮檺
-no.permission=鎮ㄦ病鏈夋暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.create.permission=鎮ㄦ病鏈夊垱寤烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.update.permission=鎮ㄦ病鏈変慨鏀规暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.delete.permission=鎮ㄦ病鏈夊垹闄ゆ暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.export.permission=鎮ㄦ病鏈夊鍑烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.view.permission=鎮ㄦ病鏈夋煡鐪嬫暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
+##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F
+upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01<br/>\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01
+upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26
+
+##\u6743\u9650
+no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index ef7ea58..33fc965 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -16,7 +16,11 @@
</description>
<dependencies>
-
+ <dependency>
+ <groupId>com.github.binarywang</groupId>
+ <artifactId>weixin-java-common</artifactId>
+ <version>4.1.0</version>
+ </dependency>
<!-- Spring妗嗘灦鍩烘湰鐨勬牳蹇冨伐鍏� -->
<dependency>
<groupId>org.springframework</groupId>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java
new file mode 100644
index 0000000..3d2f30b
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java
@@ -0,0 +1,37 @@
+package com.ruoyi.common.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+/**
+ * zhuo
+ */
+
+@Configuration
+@Component
+@ConfigurationProperties(prefix = "sso")
+@Data
+public class SsoBean {
+
+ /**
+ * 鍗曠偣鐧诲綍搴旂敤id
+ */
+ private String clientId;
+
+ /**
+ * 鍗曠偣鐧诲綍搴旂敤绉橀挜
+ */
+ private String clientSecret;
+
+ /**
+ * 鍗曠偣鐧诲綍鏈嶅姟鍦板潃
+ */
+ private String url;
+
+ /**
+ * 鍗曠偣鐧诲綍鍥炶皟鍦板潃
+ */
+ private String callbackUrl;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java
index f463e6f..5ab9b30 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.stereotype.Component;
@@ -20,7 +21,7 @@
*/
@Component
public class JackSonUtil {
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
private static final ObjectWriter OBJECT_WRITER = OBJECT_MAPPER.writerWithDefaultPrettyPrinter();
public static void marshal(File file, Object value) throws Exception {
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 878b673..4fdc0b2 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -1,10 +1,13 @@
package com.ruoyi.framework.config;
+import com.ruoyi.framework.web.ssoAuth.SsoCodeAuthenticationProvider;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
@@ -21,6 +24,9 @@
import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* spring security閰嶇疆
*
@@ -34,7 +40,14 @@
* 鑷畾涔夌敤鎴疯璇侀�昏緫
*/
@Autowired
+ @Qualifier("UserDetailsServiceImpl")
private UserDetailsService userDetailsService;
+ /**
+ * 鑷畾涔夌敤鎴疯璇侀�昏緫
+ */
+ @Autowired
+ @Qualifier("UserDetailsByOpenIdServiceImpl")
+ private UserDetailsService userDetailsServiceByOpenId;
/**
* 璁よ瘉澶辫触澶勭悊绫�
@@ -75,7 +88,16 @@
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userDetailsService);
daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
- return new ProviderManager(daoAuthenticationProvider);
+
+ // sso鐧婚檰閴存潈 Provider
+ SsoCodeAuthenticationProvider wxCodeAuthenticationProvider = new SsoCodeAuthenticationProvider();
+ wxCodeAuthenticationProvider.setUserDetailsService(userDetailsServiceByOpenId);
+ List<AuthenticationProvider> providers = new ArrayList<>();
+
+ providers.add(wxCodeAuthenticationProvider);
+ providers.add(daoAuthenticationProvider);
+
+ return new ProviderManager(providers);
}
/**
@@ -111,7 +133,7 @@
.authorizeHttpRequests((requests) -> {
permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
// 瀵逛簬鐧诲綍login 娉ㄥ唽register 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶
- requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+ requests.antMatchers("/login", "/register", "/captchaImage","/getSsoAuthUrl","/loginBySSO").permitAll()
// 闈欐�佽祫婧愶紝鍙尶鍚嶈闂�
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**", "/img/**", "/word/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java
new file mode 100644
index 0000000..f7e69e1
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java
@@ -0,0 +1,20 @@
+package com.ruoyi.framework.model;
+
+import lombok.Data;
+
+/**
+ * zhuo
+ */
+@Data
+public class SsoOauthTokenModel {
+
+ private String access_token;
+
+ private String expires_in;
+
+ private String id_token;
+
+ private String scope;
+
+ private String token_type;
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java
new file mode 100644
index 0000000..e5a50f4
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java
@@ -0,0 +1,40 @@
+package com.ruoyi.framework.model;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * zhuo
+ */
+@Data
+public class SsoUserInfoModel {
+ private String avatar;
+
+ @JSONField(name="nick_name")
+ private String nickName;
+
+ private String openid;
+
+ @JSONField(name="org_id")
+ private String orgId;
+
+ @JSONField(name="org_name")
+ private String orgName;
+
+ @JSONField(name="org_role")
+ private String orgRole;
+
+ @JSONField(name="phone_number")
+ private String phoneNumber;
+
+ private String sid;
+
+
+ private String sub;
+
+ @JSONField(name="employee_id")
+ private String employeeId;
+
+ @JSONField(name="department_code")
+ private String departmentCode;
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
index ba23910..732dd36 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
@@ -1,14 +1,7 @@
package com.ruoyi.framework.security.handle;
-import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.config.SsoBean;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
@@ -18,6 +11,16 @@
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.web.service.TokenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
/**
* 鑷畾涔夐��鍑哄鐞嗙被 杩斿洖鎴愬姛
@@ -29,6 +32,10 @@
{
@Autowired
private TokenService tokenService;
+ @Autowired
+ private RedisTemplate redisTemplate;
+ @Autowired
+ private SsoBean ssoBean;
/**
* 閫�鍑哄鐞�
@@ -40,14 +47,24 @@
throws IOException, ServletException
{
LoginUser loginUser = tokenService.getLoginUser(request);
+ String loginOutUrl = null;
if (StringUtils.isNotNull(loginUser))
{
String userName = loginUser.getUsername();
// 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍
tokenService.delLoginUser(loginUser.getToken());
// 璁板綍鐢ㄦ埛閫�鍑烘棩蹇�
- AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
+ // 娓呴櫎鍗曠偣鐧诲綍淇℃伅
+ Object idToken = redisTemplate.opsForValue().get("ssoOauthToken:idToken:" + userName);
+ if (idToken != null) {
+ loginOutUrl = ssoBean.getUrl() + "/oauth2/sessions/logout?id_token_hint=" + idToken;
+ redisTemplate.delete("ssoOauthToken:idToken:" + userName);
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.sso.logout.success")));
+ } else {
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
+ }
+
}
- ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success"))));
+ ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success"), loginOutUrl)));
}
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index fe16427..40581ba 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -1,7 +1,29 @@
package com.ruoyi.framework.web.service;
import javax.annotation.Resource;
+import javax.net.ssl.SSLContext;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.common.config.SsoBean;
+import com.ruoyi.framework.model.SsoOauthTokenModel;
+import com.ruoyi.framework.model.SsoUserInfoModel;
+import com.ruoyi.framework.web.ssoAuth.SsoCodeAuthenticationToken;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.TrustStrategy;
+import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.http.NameValuePair;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -29,11 +51,23 @@
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
/**
* 鐧诲綍鏍¢獙鏂规硶
*
* @author ruoyi
*/
+@Slf4j
@Component
public class SysLoginService
{
@@ -47,10 +81,17 @@
private RedisCache redisCache;
@Autowired
- private ISysUserService userService;
+ private ISysUserService sysUserService;
@Autowired
private ISysConfigService configService;
+
+ @Autowired
+ private SsoBean ssoBean;
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+
/**
* 鐧诲綍楠岃瘉
@@ -176,6 +217,169 @@
sysUser.setUserId(userId);
sysUser.setLoginIp(IpUtils.getIpAddr());
sysUser.setLoginDate(DateUtils.getNowDate());
- userService.updateUserProfile(sysUser);
+ sysUserService.updateUserProfile(sysUser);
}
+
+ /**
+ * 鍗曠偣鐧诲綍
+ * @param code
+ * @return
+ */
+ public String loginBySSO(String code) {
+
+ // 鑾峰彇鍗曠偣鐧诲綍token
+ SsoOauthTokenModel tokenModel = this.getSsoAccessToken(code);
+ if (tokenModel == null) {
+ throw new RuntimeException("鍗曠偣鐧诲綍楠岃瘉澶辫触");
+ }
+
+ // 鑾峰彇鍗曠偣鐧诲綍鐢ㄦ埛淇℃伅
+ SsoUserInfoModel userInfo = this.getSsoUserInfo(tokenModel.getAccess_token());
+ if (userInfo == null) {
+ throw new RuntimeException("鍗曠偣鐧诲綍楠岃瘉澶辫触");
+ }
+
+ // 鏌ヨ鏈湴鐢ㄦ埛淇℃伅
+ LoginUser loginUser = this.getSsoLoginToken(userInfo.getEmployeeId());
+ recordLoginInfo(loginUser.getUserId());
+
+ // 鍒涘缓鐧诲綍淇℃伅
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(userInfo.getEmployeeId(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.sso.login.success")));
+ redisTemplate.opsForValue().set("ssoOauthToken:idToken:" + userInfo.getEmployeeId(), tokenModel.getId_token(), 3, TimeUnit.DAYS);
+ // 鐢熸垚token
+ return tokenService.createToken(loginUser);
+ }
+
+ /**
+ * ***** 鑾峰彇鏈湴鐢ㄦ埛淇℃伅 *****
+ * @param username
+ * @return
+ */
+ public LoginUser getSsoLoginToken(String username) {
+ // 鐢ㄦ埛楠岃瘉
+ Authentication authentication = null;
+ SysUser sysUser = sysUserService.selectUserByUserName(username);
+ if (sysUser == null) {
+ throw new ServiceException("褰撳墠绯荤粺娌℃湁璇ョ敤鎴�");
+ }
+ try
+ {
+ // 鏃犻渶瀵嗙爜鑾峰彇鐢ㄦ埛淇℃伅
+ authentication = authenticationManager.authenticate(new SsoCodeAuthenticationToken(username));
+ }
+ catch (Exception e)
+ {
+ if (e instanceof BadCredentialsException)
+ {
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.sso.not.match")));
+ throw new UserPasswordNotMatchException();
+ }
+ else
+ {
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+ throw new ServiceException(e.getMessage());
+ }
+ }
+ finally
+ {
+ AuthenticationContextHolder.clearContext();
+ }
+ AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.sso.login.success")));
+ return (LoginUser) authentication.getPrincipal();
+
+ }
+
+
+ /**
+ * **** 鑾峰彇鍗曠偣鐧诲綍token ****
+ * @param code
+ * @return
+ */
+ public SsoOauthTokenModel getSsoAccessToken(String code) {
+ List<NameValuePair> list = new LinkedList<>();
+ list.add(new BasicNameValuePair("grant_type", "authorization_code"));
+ list.add(new BasicNameValuePair("code", code));
+ list.add(new BasicNameValuePair("client_id", ssoBean.getClientId()));
+ list.add(new BasicNameValuePair("client_secret", ssoBean.getClientSecret()));
+ list.add(new BasicNameValuePair("redirect_uri", ssoBean.getCallbackUrl()));
+
+ Map<String, String> headers = new HashMap<>();
+ headers.put("Content-Type", "application/x-www-form-urlencoded");
+ headers.put("Accept", "application/json");
+ String result = doPost(ssoBean.getUrl() + "/oauth2/token", headers, list);
+ if (org.apache.commons.lang3.StringUtils.isBlank(result)) {
+ return null;
+ }
+ return JSON.parseObject(result, SsoOauthTokenModel.class);
+ }
+
+ /**
+ * ***鑾峰彇鍗曠偣鐧诲綍鐢ㄦ埛淇℃伅***
+ * @param accessToken
+ * @return
+ */
+ public SsoUserInfoModel getSsoUserInfo(String accessToken) {
+ Map<String, String> headers = new HashMap<>();
+ headers.put("Authorization", "Bearer " + accessToken);
+ String result = doPost(ssoBean.getUrl() + "/userinfo", headers, null);
+ if (org.apache.commons.lang3.StringUtils.isBlank(result)) {
+ return null;
+ }
+ return JSON.parseObject(result, SsoUserInfoModel.class);
+ }
+
+ public static String doPost(String url, Map<String, String> headers, List<NameValuePair> params) {
+ CloseableHttpClient client = createSSLClientDefault();
+ CloseableHttpResponse response = null;
+ try {
+ HttpPost method = new HttpPost(url);
+ headers.forEach(method::setHeader);
+ if (params != null) {
+ method.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
+ }
+
+ response = client.execute(method);
+ if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+ HttpEntity entity = response.getEntity();
+ return EntityUtils.toString(entity);
+ }
+ } catch (Exception e) {
+ log.error("缁熶竴鐧诲綍璇锋眰鍑虹幇寮傚父", e.getMessage());
+ } finally {
+ try {
+ if (client != null) {
+ client.close();
+ }
+ if (response != null) {
+ response.close();
+ }
+ } catch (Exception e) {
+ log.error("缁熶竴鐧诲綍璇锋眰鍑虹幇寮傚父", e.getMessage());
+ }
+ }
+ return null;
+ }
+//
+//
+ private static CloseableHttpClient createSSLClientDefault() {
+ try {
+ SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+ //淇′换鎵�鏈�
+ @Override
+ public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ return true;
+ }
+ }).build();
+ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
+ return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+ } catch (KeyManagementException e) {
+ e.printStackTrace();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ }
+ return HttpClients.createDefault();
+ }
+
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java
new file mode 100644
index 0000000..070f002
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java
@@ -0,0 +1,46 @@
+package com.ruoyi.framework.web.service;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.enums.UserStatus;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service("UserDetailsByOpenIdServiceImpl")
+public class UserDetailsByOpenIdServiceImpl implements UserDetailsService {
+
+
+
+ @Autowired
+ private ISysUserService userService;
+
+ @Autowired
+ private SysPermissionService permissionService;
+
+ @Override
+ public UserDetails loadUserByUsername(String openId) throws UsernameNotFoundException {
+ SysUser user = userService.selectUserByUserName(openId);
+ if (StringUtils.isNull(user)) {
+
+ throw new UsernameNotFoundException("鐧诲綍鐢ㄦ埛锛�" + openId + " 涓嶅瓨鍦�");
+ } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
+
+ throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛�" + openId + " 宸茶鍒犻櫎");
+ } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+
+ throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛�" + openId + " 宸插仠鐢�");
+ }
+ // 鍜岃嫢渚濈殑鍖哄埆 鏄病鏈夐獙璇佸瘑鐮�
+ return createLoginUser(user);
+ }
+
+ public UserDetails createLoginUser(SysUser user) {
+ return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
+ }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
index 5dcdf90..2733d23 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -1,12 +1,5 @@
package com.ruoyi.framework.web.service;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
@@ -14,20 +7,27 @@
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
/**
* 鐢ㄦ埛楠岃瘉澶勭悊
*
* @author ruoyi
*/
-@Service
+@Service("UserDetailsServiceImpl")
public class UserDetailsServiceImpl implements UserDetailsService
{
private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
@Autowired
private ISysUserService userService;
-
+
@Autowired
private SysPasswordService passwordService;
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java
new file mode 100644
index 0000000..fdf3603
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java
@@ -0,0 +1,42 @@
+package com.ruoyi.framework.web.ssoAuth;
+
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+public class SsoCodeAuthenticationProvider implements AuthenticationProvider {
+
+ private UserDetailsService userDetailsService;
+
+ @Override
+ public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+ SsoCodeAuthenticationToken authenticationToken = (SsoCodeAuthenticationToken) authentication;
+
+ String openId = (String) authenticationToken.getPrincipal();
+
+ UserDetails userDetails = userDetailsService.loadUserByUsername(openId);
+
+ // 姝ゆ椂閴存潈鎴愬姛鍚庯紝搴斿綋閲嶆柊 new 涓�涓嫢鏈夐壌鏉冪殑 authenticationResult 杩斿洖
+ SsoCodeAuthenticationToken authenticationResult = new SsoCodeAuthenticationToken(userDetails, userDetails.getAuthorities());
+
+ authenticationResult.setDetails(authenticationToken.getDetails());
+
+ return authenticationResult;
+ }
+
+
+ @Override
+ public boolean supports(Class<?> authentication) {
+ // 鍒ゆ柇 authentication 鏄笉鏄� WxCodeAuthenticationToken 鐨勫瓙绫绘垨瀛愭帴鍙�
+ return SsoCodeAuthenticationToken.class.isAssignableFrom(authentication);
+ }
+
+ public UserDetailsService getUserDetailsService() {
+ return userDetailsService;
+ }
+
+ public void setUserDetailsService(UserDetailsService userDetailsService) {
+ this.userDetailsService = userDetailsService;
+ }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java
new file mode 100644
index 0000000..b783f36
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java
@@ -0,0 +1,63 @@
+package com.ruoyi.framework.web.ssoAuth;
+
+import org.springframework.security.authentication.AbstractAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.SpringSecurityCoreVersion;
+
+import java.util.Collection;
+
+public class SsoCodeAuthenticationToken extends AbstractAuthenticationToken {
+
+ private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
+
+ /**
+ * 鍦� UsernamePasswordAuthenticationToken 涓瀛楁浠h〃鐧诲綍鐨勭敤鎴峰悕锛�
+ * 鍦ㄨ繖閲屽氨浠h〃鐧诲綍鐨刼penId
+ */
+ private final Object principal;
+
+ /**
+ * 鏋勫缓涓�涓病鏈夐壌鏉冪殑 SsoCodeAuthenticationToken
+ */
+ public SsoCodeAuthenticationToken(Object principal) {
+ super(null);
+ this.principal = principal;
+ setAuthenticated(false);
+ }
+
+ /**
+ * 鏋勫缓鎷ユ湁閴存潈鐨� SsoCodeAuthenticationToken
+ */
+ public SsoCodeAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
+ super(authorities);
+ this.principal = principal;
+ // must use super, as we override
+ super.setAuthenticated(true);
+ }
+
+ @Override
+ public Object getCredentials() {
+ return null;
+ }
+
+ @Override
+ public Object getPrincipal() {
+ return this.principal;
+ }
+
+ @Override
+ public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
+ if (isAuthenticated) {
+ throw new IllegalArgumentException(
+ "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
+ }
+
+ super.setAuthenticated(false);
+ }
+
+ @Override
+ public void eraseCredentials() {
+ super.eraseCredentials();
+ }
+
+}
--
Gitblit v1.9.3