Parcourir la source

新增教研分析单点登录

wangliang il y a 3 ans
Parent
commit
04de4010b8

+ 18 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/SsoService.java

@@ -1,5 +1,8 @@
 package com.qmth.distributed.print.business.service;
 
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
+
+import java.io.IOException;
 import java.util.Map;
 
 /**
@@ -11,4 +14,19 @@ public interface SsoService {
     Map<String, Object> markerLoginInfo();
 
     Map<String, Object> markerLeaderLoginInfo();
+
+    /**
+     * 教研分析单点登录
+     *
+     * @param loginName
+     * @param role
+     * @param orgName
+     * @param realName
+     * @param mobileNumber
+     * @param enable
+     * @param returnUrl
+     * @return
+     * @throws IOException
+     */
+    Map<String, Object> analysisLogin(String loginName, RoleTypeEnum role, String orgName, String realName, String mobileNumber, Boolean enable, String returnUrl) throws IOException;
 }

+ 57 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SsoServiceImpl.java

@@ -1,9 +1,16 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.qmth.boot.tools.signature.SignatureEntity;
+import com.qmth.boot.tools.signature.SignatureType;
 import com.qmth.distributed.print.business.service.SsoService;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicSchool;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
+import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -12,14 +19,17 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * @Date: 2021/5/20.
  */
 @Service
 public class SsoServiceImpl implements SsoService {
-
     private final static Logger log = LoggerFactory.getLogger(SsoServiceImpl.class);
 
     @Autowired
@@ -28,6 +38,12 @@ public class SsoServiceImpl implements SsoService {
     @Autowired
     CloudMarkingTaskUtils stmmsUtils;
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
+    @Resource
+    CommonCacheService commonCacheService;
+
     @Override
     public Map<String, Object> markerLoginInfo() {
         try {
@@ -58,4 +74,44 @@ public class SsoServiceImpl implements SsoService {
         }
     }
 
+    /**
+     * 教研分析单点登录
+     *
+     * @param loginName
+     * @param role
+     * @param orgName
+     * @param realName
+     * @param mobileNumber
+     * @param enable
+     * @param returnUrl
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public Map<String, Object> analysisLogin(String loginName, RoleTypeEnum role, String orgName, String realName, String mobileNumber, Boolean enable, String returnUrl) throws IOException {
+        Long schoolId = SystemConstant.getHeadOrUserSchoolId();
+        BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
+
+        Map<String, Object> map = new HashMap<>();
+        map.computeIfAbsent("loginName", v -> loginName);
+        map.computeIfAbsent("role", v -> role);
+        map.computeIfAbsent("orgName", v -> orgName);
+        map.computeIfAbsent("realName", v -> realName);
+        map.computeIfAbsent("mobileNumber", v -> mobileNumber);
+        map.computeIfAbsent("returnUrl", v -> returnUrl);
+
+        Long timestamp = System.currentTimeMillis();
+        String accessToken = SignatureEntity.build(SignatureType.SECRET, SystemConstant.METHOD, dictionaryConfig.reportOpenDomain().getSsoLoginApi(), timestamp, basicSchool.getAccessKey(), basicSchool.getAccessSecret());
+        map.computeIfAbsent("time", v -> timestamp);
+        map.computeIfAbsent("authorization", v -> accessToken);
+
+        String hostUrl = dictionaryConfig.reportOpenDomain().getHostUrl();
+        Optional.ofNullable(hostUrl).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置教研分析host"));
+
+        if (hostUrl.contains("*")) {
+            hostUrl = hostUrl.replace("*", basicSchool.getCode());
+        }
+        map.put("redirectUrl", hostUrl + dictionaryConfig.reportOpenDomain().getSsoLoginApi());
+        return map;
+    }
 }

+ 22 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/SsoController.java

@@ -3,16 +3,20 @@ package com.qmth.distributed.print.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.service.SsoService;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.IOException;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
@@ -52,5 +56,21 @@ public class SsoController {
         Map<String, Object> map = ssoService.markerLeaderLoginInfo();
         return ResultUtil.ok(map);
     }
+
+    @ApiOperation(value = "教研分析单点登录")
+    @ApiResponses({@ApiResponse(code = 200, message = "教研分析单点登录", response = Objects.class)})
+    @RequestMapping(value = "/analysis_login", method = RequestMethod.POST)
+    public Result analysisLogin(@ApiParam(value = "登录名", required = true) @RequestParam String loginName,
+                                @ApiParam(value = "角色", required = true) @RequestParam RoleTypeEnum role,
+                                @ApiParam(value = "学院名称", required = true) @RequestParam String orgName,
+                                @ApiParam(value = "真实名", required = false) @RequestParam(required = false) String realName,
+                                @ApiParam(value = "手机号码", required = false) @RequestParam(required = false) String mobileNumber,
+                                @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Boolean enable,
+                                @ApiParam(value = "返回url", required = true) @RequestParam String returnUrl) throws IOException {
+        if (role != RoleTypeEnum.OFFICE_TEACHER && role != RoleTypeEnum.PRESIDENT && role != RoleTypeEnum.TEACHER) {
+            throw ExceptionResultEnum.ERROR.exception("角色类型超出限制");
+        }
+        return ResultUtil.ok(ssoService.analysisLogin(loginName, role, orgName, realName, mobileNumber, enable, returnUrl));
+    }
 }
 

+ 3 - 3
distributed-print/src/main/resources/application-dev.properties

@@ -12,9 +12,9 @@ spring.application.name=distributed-print
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=distributed-v3.0.2
+db.name=distributed-v3.1.0
 db.username=root
-db.password=88888888
+db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
@@ -197,7 +197,7 @@ sms.config.aliyunSMSAuditRejectCode=SMS_237206063
 sms.config.aliyunSMSUploadStructureCode=SMS_237201068
 sms.config.aliyunSMSAuditCopyUserCode=SMS_237206065
 
-report.open.hostUrl=http://127.0.0.1:7004
+report.open.hostUrl=http://192.168.10.86:7004
 report.open.semesterApi=/api/report/open/semester_edit
 report.open.examApi=/api/report/open/exam_edit
 report.open.courseEditApi=/api/report/open/course_edit

+ 67 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/AuthThirdUtil.java

@@ -5,6 +5,7 @@ import com.qmth.boot.tools.signature.SignatureEntity;
 import com.qmth.boot.tools.signature.SignatureType;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.entity.BasicSchool;
+import com.qmth.teachcloud.common.entity.TBSession;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.BasicSchoolService;
 import org.slf4j.Logger;
@@ -23,20 +24,83 @@ import java.util.Optional;
 public class AuthThirdUtil {
     private final static Logger log = LoggerFactory.getLogger(AuthThirdUtil.class);
 
+    /**
+     * 鉴权
+     *
+     * @param expireTime
+     * @param authorization
+     * @return
+     */
+    public static TBSession hasPermissionLogout(Long expireTime, String authorization) {
+        RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+        HttpServletRequest request = ServletUtil.getRequest();
+        String url = request.getServletPath();
+        //验证authorization
+        Optional.ofNullable(authorization).orElseThrow(() -> ExceptionResultEnum.AUTHORIZATION_INVALID.exception());
+        Optional.ofNullable(expireTime).orElseThrow(() -> ExceptionResultEnum.TIME_INVALID.exception());
+
+        String method = request.getMethod();
+        final SignatureEntity info = SignatureEntity.parse(authorization, method, url, expireTime);
+        Optional.ofNullable(info).orElseThrow(() -> ExceptionResultEnum.AUTHORIZATION_ERROR.exception());
+
+        if (!url.equalsIgnoreCase(info.getUri())) {
+            log.warn("url faile: url error");
+            throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
+        }
+        if (!method.equalsIgnoreCase(info.getMethod())) {
+            log.warn("method faile: method error");
+            throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
+        }
+        if (info.getTimestamp() > expireTime) {
+            log.warn("Authorization faile: session has expired, expire time=" + expireTime);
+            throw ExceptionResultEnum.TIME_INVALID.exception();
+        }
+        if (SignatureType.TOKEN != info.getType()) {
+            log.warn("Authorization faile: signature type is not Token");
+            throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
+        }
+        TBSession tbSession = (TBSession) redisUtil.getUserSession(info.getInvoker());
+        Optional.ofNullable(tbSession).orElseThrow(() -> ExceptionResultEnum.AUTHORIZATION_ERROR.exception());
+        if (!info.validate(tbSession.getAccessToken())) {
+            log.warn("Authorization faile: token invalid, token is " + tbSession.getAccessToken());
+            throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
+        }
+        return tbSession;
+    }
+
+    /**
+     * 鉴权
+     *
+     * @param expireTime
+     * @param authorization
+     * @return
+     */
+    public static BasicSchool hasPermission(Long expireTime, String authorization) {
+        return commonHasPermission(expireTime, authorization);
+    }
+
     /**
      * 鉴权
      *
      * @return
      */
     public static BasicSchool hasPermission() {
+        return commonHasPermission(ServletUtil.getRequestTime(), ServletUtil.getRequestAuthorization());
+    }
+
+    /**
+     * 公用方法
+     *
+     * @param expireTime
+     * @param authorization
+     * @return
+     */
+    protected static BasicSchool commonHasPermission(Long expireTime, String authorization) {
         BasicSchoolService basicSchoolService = SpringContextHolder.getBean(BasicSchoolService.class);
         HttpServletRequest request = ServletUtil.getRequest();
         String url = request.getServletPath();
         //验证authorization
-        String authorization = ServletUtil.getRequestAuthorization();
         Optional.ofNullable(authorization).orElseThrow(() -> ExceptionResultEnum.AUTHORIZATION_INVALID.exception());
-
-        Long expireTime = ServletUtil.getRequestTime();
         Optional.ofNullable(expireTime).orElseThrow(() -> ExceptionResultEnum.TIME_INVALID.exception());
 
         String method = request.getMethod();

+ 5 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java

@@ -1,12 +1,14 @@
 package com.qmth.teachcloud.report.business.service;
 
 import com.qmth.teachcloud.common.entity.BasicAttachment;
+import com.qmth.teachcloud.common.entity.TBSession;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.enums.SemesterEnum;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
 import java.util.List;
 
 /**
@@ -111,8 +113,10 @@ public interface ReportCommonService {
 
     /**
      * 第三方退出
+     *
+     * @param tbSession
      */
-    public void thirdLogout() throws IOException;
+    public void thirdLogout(TBSession tbSession) throws IOException;
 
     /**
      * 获取开课课程考试课程总览

+ 35 - 17
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java

@@ -9,13 +9,14 @@ import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBSession;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
-import com.qmth.teachcloud.common.util.FileStoreUtil;
-import com.qmth.teachcloud.common.util.JacksonUtil;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.service.TBSessionService;
+import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.cache.ThirdUserAuthCacheUtil;
 import com.qmth.teachcloud.report.business.entity.*;
@@ -100,6 +101,18 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     @Resource
     BasicAttachmentService basicAttachmentService;
 
+    @Resource
+    SysUserService sysUserService;
+
+    @Resource
+    TBSessionService tbSessionService;
+
+    @Resource
+    RedisUtil redisUtil;
+
+    @Resource
+    CommonCacheService commonCacheService;
+
     /**
      * 学院学科报表查询科目信息
      *
@@ -637,22 +650,27 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     /**
      * 第三方退出
      *
-     * @throws IOException
+     * @param tbSession
      */
     @Override
-    public void thirdLogout() throws IOException {
-        HttpServletRequest request = ServletUtil.getRequest();
-        HttpServletResponse response = ServletUtil.getResponse();
-        HttpSession session = request.getSession();
-        if (Objects.nonNull(session)) {
-            session.invalidate();
-            log.info("logout is come in,session:{}", JacksonUtil.parseJson(session));
+    public void thirdLogout(TBSession tbSession) throws IOException {
+        SysUser sysUser = sysUserService.getById(Long.parseLong(tbSession.getIdentity()));
+        try {
+            tbSessionService.removeById(tbSession.getId());
+            redisUtil.deleteUserSession(tbSession.getId());
+            commonCacheService.removeUserCache(sysUser.getId());
+            commonCacheService.removeUserAuthCache(sysUser.getId());
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        } finally {
+            if (Objects.nonNull(sysUser)) {
+                HttpServletResponse response = ServletUtil.getResponse();
+                String redirectURL = ThirdUserAuthCacheUtil.getAuthReturnUrl(String.valueOf(sysUser.getId()));
+                ThirdUserAuthCacheUtil.deleteAuthReturnUrl(String.valueOf(sysUser.getId()));
+                response.setHeader("Access-Control-Allow-Origin", "*");
+                response.sendRedirect(redirectURL);
+            }
         }
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        String redirectURL = ThirdUserAuthCacheUtil.getAuthReturnUrl(String.valueOf(sysUser.getId()));
-        ThirdUserAuthCacheUtil.deleteAuthReturnUrl(String.valueOf(sysUser.getId()));
-        response.setHeader("Access-Control-Allow-Origin", "*");
-        response.sendRedirect(redirectURL);
     }
 
     /**

+ 39 - 33
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SsoApiController.java

@@ -12,12 +12,9 @@ import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.AppSourceEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.service.*;
-import com.qmth.teachcloud.common.util.AuthThirdUtil;
-import com.qmth.teachcloud.common.util.JacksonUtil;
-import com.qmth.teachcloud.common.util.Result;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.report.business.bean.params.LoginThirdParam;
+import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.report.business.cache.ThirdUserAuthCacheUtil;
 import com.qmth.teachcloud.report.business.service.ReportCommonService;
 import io.swagger.annotations.*;
@@ -26,10 +23,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -81,43 +80,45 @@ public class SsoApiController {
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @Aac(auth = BOOL.FALSE)
     @Transactional
-    public void login(@ApiParam(value = "接收登录数据信息", required = true) @RequestBody String result, HttpServletRequest request, HttpServletResponse response) throws IOException {
-        Optional.ofNullable(result).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("数据为空"));
-        String decodeJson = URLDecoder.decode(result, SystemConstant.CHARSET_NAME);
-        log.info("login进来了,result:{}", decodeJson);
-        LoginThirdParam loginThirdParam = JacksonUtil.readJson(decodeJson, LoginThirdParam.class);
-        Optional.ofNullable(loginThirdParam).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("转换后的数据为空"));
-        loginThirdParam.validParams();
-        BasicSchool basicSchool = AuthThirdUtil.hasPermission();
+    public void login(@ApiParam(value = "登录名", required = true) @RequestParam String loginName,
+                      @ApiParam(value = "角色", required = true) @RequestParam RoleTypeEnum role,
+                      @ApiParam(value = "学院名称", required = true) @RequestParam String orgName,
+                      @ApiParam(value = "真实名", required = false) @RequestParam(required = false) String realName,
+                      @ApiParam(value = "手机号码", required = false) @RequestParam(required = false) String mobileNumber,
+                      @ApiParam(value = "是否启用", required = false) @RequestParam(required = false) Boolean enable,
+                      @ApiParam(value = "返回url", required = true) @RequestParam String returnUrl,
+                      @ApiParam(value = "时间戳", required = true) @RequestParam Long time,
+                      @ApiParam(value = "鉴权", required = true) @RequestParam String authorization) throws IOException {
+        BasicSchool basicSchool = AuthThirdUtil.hasPermission(time, authorization);
         //插入或者更新用户
         //查询用户是否存在
         QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
         sysUserQueryWrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId())
-                .eq(SysUser::getLoginName, loginThirdParam.getLoginName())
+                .eq(SysUser::getLoginName, loginName)
                 .eq(SysUser::getEnable, true);
         SysUser sysUser = sysUserService.getOne(sysUserQueryWrapper);
         if (Objects.isNull(sysUser)) {//新增
             sysUser = new SysUser(basicSchool.getId(),
-                    loginThirdParam.getLoginName(),
-                    Objects.nonNull(loginThirdParam.getRealName()) ? loginThirdParam.getRealName() : loginThirdParam.getLoginName(),
-                    Objects.nonNull(loginThirdParam.getMobileNumber()) ? loginThirdParam.getMobileNumber() : null);
+                    loginName,
+                    Objects.nonNull(realName) ? realName : loginName,
+                    Objects.nonNull(mobileNumber) ? mobileNumber : null);
         } else {
             sysUser.setSchoolId(basicSchool.getId());
-            if (Objects.nonNull(loginThirdParam.getRealName())) {
-                sysUser.setRealName(loginThirdParam.getRealName());
+            if (Objects.nonNull(realName)) {
+                sysUser.setRealName(realName);
             }
-            if (Objects.nonNull(loginThirdParam.getMobileNumber())) {
-                sysUser.setMobileNumber(loginThirdParam.getMobileNumber());
+            if (Objects.nonNull(mobileNumber)) {
+                sysUser.setMobileNumber(mobileNumber);
             }
         }
-        if (Objects.nonNull(loginThirdParam.getEnable())) {
-            sysUser.setEnable(loginThirdParam.getEnable());
+        if (Objects.nonNull(enable)) {
+            sysUser.setEnable(enable);
         }
 
         //查询学院id
         QueryWrapper<SysOrg> sysOrgQueryWrapper = new QueryWrapper<>();
         sysOrgQueryWrapper.lambda().eq(SysOrg::getSchoolId, basicSchool.getId())
-                .eq(SysOrg::getName, loginThirdParam.getOrgName())
+                .eq(SysOrg::getName, orgName)
                 .eq(SysOrg::getEnable, true);
         SysOrg sysOrg = sysOrgService.getOne(sysOrgQueryWrapper);
         Optional.ofNullable(sysOrg).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("学院数据为空"));
@@ -126,7 +127,7 @@ public class SsoApiController {
 
         //新增用户和角色关系
         QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
-        sysRoleQueryWrapper.lambda().eq(SysRole::getType, loginThirdParam.getRole())
+        sysRoleQueryWrapper.lambda().eq(SysRole::getType, role)
                 .eq(SysRole::getEnable, true);
         SysRole sysRole = sysRoleService.getOne(sysRoleQueryWrapper);
         Optional.ofNullable(sysRole).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("角色数据为空"));
@@ -139,7 +140,9 @@ public class SsoApiController {
         String pattern = "{0}{1}{2}";
         String code = URLEncoder.encode(MessageFormat.format(pattern, userAuthenticationDto.getUid(), SignatureEntityTest.FIELD_JOINER, SignatureEntityTest.encrypt(userAuthenticationDto.getCode())), SystemConstant.CHARSET_NAME);
 
-        ThirdUserAuthCacheUtil.setAuthReturnUrl(String.valueOf(sysUser.getId()), loginThirdParam.getReturnUrl());
+        ThirdUserAuthCacheUtil.setAuthReturnUrl(String.valueOf(sysUser.getId()), returnUrl);
+
+        HttpServletResponse response = ServletUtil.getResponse();
         response.setHeader("Access-Control-Allow-Origin", "*");
         response.sendRedirect(dictionaryConfig.sysDomain().getLoginAuthenUrl() + code + "/" + AppSourceEnum.PRINT_THIRD);
     }
@@ -148,7 +151,8 @@ public class SsoApiController {
     @RequestMapping(value = "/user/authentication/login", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = LoginResult.class)})
     @Aac(auth = BOOL.FALSE)
-    public Result login(@ApiParam(value = "授权码信息", required = true) @RequestParam String code) throws NoSuchAlgorithmException, UnsupportedEncodingException {
+    public Result login(@ApiParam(value = "授权码信息", required = true) @RequestParam String code,
+                        @ApiParam(value = "应用来源", required = true) @RequestParam AppSourceEnum appSource) throws NoSuchAlgorithmException, UnsupportedEncodingException {
         String[] values = StringUtils.split(URLDecoder.decode(code, SystemConstant.CHARSET_NAME), SignatureEntityTest.FIELD_JOINER);
         if (Objects.isNull(values) || values.length != 2) {
             throw ExceptionResultEnum.ERROR.exception("临时授权码出错,请重新获取");
@@ -168,16 +172,18 @@ public class SsoApiController {
         if (Objects.isNull(userAuthCode) || !Objects.equals(values[1], URLDecoder.decode(SignatureEntityTest.encrypt(userAuthCode), SystemConstant.CHARSET_NAME))) {
             throw ExceptionResultEnum.ERROR.exception("临时授权码已过期");
         }
-        LoginResult loginResult = teachcloudCommonService.login(sysUser.getPassword(), sysUser, AppSourceEnum.PRINT_THIRD);
+        LoginResult loginResult = teachcloudCommonService.login(sysUser.getPassword(), sysUser, appSource);
         ThirdUserAuthCacheUtil.deleteAuthCode(values[0]);
         return ResultUtil.ok(loginResult);
     }
 
     @ApiOperation(value = "用户鉴权退出接口")
-    @RequestMapping(value = "/user/authentication/logout", method = RequestMethod.GET)
+    @RequestMapping(value = "/user/authentication/logout", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "返回消息", response = Result.class)})
     @Aac(auth = BOOL.FALSE)
-    public void authenticationLogout() throws IOException {
-        reportCommonService.thirdLogout();
+    public void logout(@ApiParam(value = "时间戳", required = true) @RequestParam Long time,
+                       @ApiParam(value = "鉴权", required = true) @RequestParam String authorization) throws IOException {
+        TBSession tbSession = AuthThirdUtil.hasPermissionLogout(time, authorization);
+        reportCommonService.thirdLogout(tbSession);
     }
 }

+ 3 - 5
teachcloud-report/src/main/resources/application-dev.properties

@@ -10,18 +10,16 @@ server.tomcat.uri-encoding=UTF-8
 spring.application.name=teachcloud-report
 
 #\u6570\u636E\u6E90\u914D\u7F6E
-#db.host=192.168.10.136
 db.host=localhost
 db.port=3306
-db.name=teachcloud_report_v3.0.2
-#db.name=teachcloud-report
+db.name=teachcloud-report-v3.1.0
 db.username=root
-db.password=88888888
+db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
 com.qmth.redis.port=6379
-com.qmth.redis.db=1
+com.qmth.redis.db=2
 #com.qmth.redis.password=123456
 
 #mysql\u914D\u7F6E