Эх сурвалжийг харах

新增题库cas单点登录

wangliang 2 жил өмнө
parent
commit
fa2334634b

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

@@ -29,4 +29,16 @@ public interface SsoService {
      * @throws IOException
      */
     Map<String, Object> analysisLogin(String loginName, RoleTypeEnum role, String orgName, String realName, String mobileNumber, Boolean enable, String returnUrl) throws IOException;
+
+    /**
+     * 题库单点登录
+     *
+     * @param loginName
+     * @param role
+     * @param returnUrl
+     * @param params
+     * @return
+     * @throws IOException
+     */
+    Map<String, Object> questionLibraryLogin(String loginName, RoleTypeEnum role, String returnUrl, String params) throws IOException;
 }

+ 103 - 9
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SsoServiceImpl.java

@@ -1,25 +1,25 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.bean.params.OpenParams;
 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.SysOrg;
-import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 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.SysOrgService;
-import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
+import com.qmth.teachcloud.common.util.JacksonUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -50,6 +50,15 @@ public class SsoServiceImpl implements SsoService {
     @Resource
     SysOrgService sysOrgService;
 
+    @Value("${cas.config.questionLoginUrl}")
+    String questionLoginUrl;
+
+    @Resource
+    SysRoleService sysRoleService;
+
+    @Resource
+    SysUserRoleService sysUserRoleService;
+
     @Override
     public Map<String, Object> markerLoginInfo() {
         try {
@@ -97,8 +106,26 @@ public class SsoServiceImpl implements SsoService {
     public Map<String, Object> analysisLogin(String loginName, RoleTypeEnum role, String orgName, String realName, String mobileNumber, Boolean enable, String returnUrl) throws IOException {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         BasicSchool basicSchool = commonCacheService.schoolCache(sysUser.getSchoolId());
+
+        QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(SysUser::getLoginName, loginName)
+                .eq(SysUser::getSchoolId, basicSchool.getId());
+        SysUser sysUserCas = sysUserService.getOne(sysUserQueryWrapper);
+        Optional.ofNullable(sysUserCas).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("用户信息为空"));
+
+        QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
+        sysRoleQueryWrapper.lambda().eq(SysRole::getType, role);
+        SysRole sysRole = sysRoleService.getOne(sysRoleQueryWrapper);
+        Optional.ofNullable(sysRole).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("角色信息为空"));
+
+        QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
+        sysUserRoleQueryWrapper.lambda().eq(SysUserRole::getUserId, sysUserCas.getId())
+                .eq(SysUserRole::getRoleId, sysRole.getId());
+        SysUserRole sysUserRole = sysUserRoleService.getOne(sysUserRoleQueryWrapper);
+        Optional.ofNullable(sysUserRole).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("用户没有该角色"));
+
         if (role == RoleTypeEnum.PRESIDENT || role == RoleTypeEnum.TEACHER) {
-            List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(sysUser.getOrgId(), false, true);
+            List<SysOrg> sysOrgList = sysOrgService.findByConnectByParentId(sysUserCas.getOrgId(), false, true);
             if (CollectionUtils.isEmpty(sysOrgList)) {
                 throw ExceptionResultEnum.ERROR.exception("未找到学院信息");
             } else {
@@ -114,8 +141,8 @@ public class SsoServiceImpl implements SsoService {
                     throw ExceptionResultEnum.ERROR.exception("未找到顶级学校信息");
                 }
             }
-        } else if (role == RoleTypeEnum.OFFICE_TEACHER && Objects.nonNull(sysUser.getOrgId())) {
-            SysOrg sysOrg = commonCacheService.orgCache(sysUser.getOrgId());
+        } else if (role == RoleTypeEnum.OFFICE_TEACHER && Objects.nonNull(sysUserCas.getOrgId())) {
+            SysOrg sysOrg = commonCacheService.orgCache(sysUserCas.getOrgId());
             if (Objects.isNull(sysOrg)) {
                 throw ExceptionResultEnum.ERROR.exception("未找到学校信息");
             } else if (Objects.nonNull(sysOrg) && sysOrg.getType() != OrgTypeEnum.SCHOOL) {
@@ -145,4 +172,71 @@ public class SsoServiceImpl implements SsoService {
         map.put("redirectUrl", hostUrl + dictionaryConfig.reportOpenDomain().getSsoLoginApi());
         return map;
     }
+
+    /**
+     * 题库单点登录
+     *
+     * @param loginName
+     * @param role
+     * @param returnUrl
+     * @param params
+     * @return
+     * @throws IOException
+     */
+    @Override
+    public Map<String, Object> questionLibraryLogin(String loginName, RoleTypeEnum role, String returnUrl, String params) throws IOException {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        BasicSchool basicSchool = commonCacheService.schoolCache(sysUser.getSchoolId());
+
+        QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(SysUser::getLoginName, loginName)
+                .eq(SysUser::getSchoolId, basicSchool.getId());
+        SysUser sysUserCas = sysUserService.getOne(sysUserQueryWrapper);
+        Optional.ofNullable(sysUserCas).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("用户信息为空"));
+
+        QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
+        sysRoleQueryWrapper.lambda().eq(SysRole::getType, role);
+        SysRole sysRole = sysRoleService.getOne(sysRoleQueryWrapper);
+        Optional.ofNullable(sysRole).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("角色信息为空"));
+
+        QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
+        sysUserRoleQueryWrapper.lambda().eq(SysUserRole::getUserId, sysUserCas.getId())
+                .eq(SysUserRole::getRoleId, sysRole.getId());
+        SysUserRole sysUserRole = sysUserRoleService.getOne(sysUserRoleQueryWrapper);
+        Optional.ofNullable(sysUserRole).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("用户没有该角色"));
+
+        //TODO 题库推送用户逻辑
+
+        //TODO 拼装redirectUrl
+        if (questionLoginUrl.contains(SystemConstant.PATH_MATCH)) {
+            questionLoginUrl = questionLoginUrl.replace(SystemConstant.PATH_MATCH, basicSchool.getCode());
+        }
+
+        long timestamp = System.currentTimeMillis();
+        String path = questionLoginUrl.substring(questionLoginUrl.indexOf(SystemConstant.PATH_SUBSTR), questionLoginUrl.length());
+        String signature = SignatureEntity.build(SignatureType.SECRET, SystemConstant.GET, path, timestamp, basicSchool.getAccessKey(), basicSchool.getAccessSecret());
+
+        StringJoiner stringJoiner = new StringJoiner("")
+                .add(questionLoginUrl)
+                .add(SystemConstant.GET_UNKNOWN).add(SystemConstant.HEADER_TIME).add(SystemConstant.GET_EQUAL).add(String.valueOf(timestamp))
+                .add(SystemConstant.GET_SYMBOL).add(SystemConstant.SIGNATURE).add(SystemConstant.GET_EQUAL).add(signature)
+                .add(SystemConstant.GET_SYMBOL).add(SystemConstant.USER).add(SystemConstant.GET_EQUAL).add(loginName);
+
+        if (Objects.nonNull(returnUrl) && !Objects.equals(returnUrl, "")) {
+            stringJoiner = stringJoiner.add(SystemConstant.GET_SYMBOL).add(SystemConstant.RETURN_URL).add(SystemConstant.GET_EQUAL).add(returnUrl);
+        }
+
+        Map<String, Object> map = new HashMap<>();
+        if (Objects.nonNull(params) && !Objects.equals(params, "")) {
+            OpenParams openParams = JacksonUtil.readJson(params, OpenParams.class);
+            stringJoiner = stringJoiner.add(SystemConstant.GET_SYMBOL).add(SystemConstant.PARAMS).add(SystemConstant.GET_EQUAL).add(JacksonUtil.parseJson(openParams));
+            map.computeIfAbsent(SystemConstant.PARAMS, v -> JacksonUtil.parseJson(openParams));
+        }
+
+        map.computeIfAbsent("loginName", v -> loginName);
+        map.computeIfAbsent("role", v -> role);
+        map.computeIfAbsent("returnUrl", v -> returnUrl);
+        map.put("redirectUrl", stringJoiner.toString());
+        return map;
+    }
 }

+ 9 - 1
distributed-print-business/src/main/resources/db/2、init-table-data.sql

@@ -708,6 +708,8 @@ INSERT INTO `sys_role` VALUES (3, NULL, NULL, '学院院长', 1, 'PRESIDENT', NU
 INSERT INTO `sys_role` VALUES (4, NULL, NULL, '任课老师', 1, 'TEACHER', NULL, NULL, NULL, NULL, 1, 'ANALYSIS', '系统内置');
 INSERT INTO `sys_role` VALUES (5, NULL, NULL, '评卷员', 1, 'MARKER', NULL, NULL, NULL, NULL, 1, 'CLOUD_MARK', '系统内置');
 INSERT INTO `sys_role` VALUES (6, NULL, NULL, '科组长', 1, 'MARKER_LEADER', NULL, NULL, NULL, NULL, 1, 'CLOUD_MARK', '系统内置');
+INSERT INTO `sys_role` VALUES (7, NULL, NULL, '学科老师', 1, 'SUBJECT_TEACHER', NULL, NULL, NULL, NULL, 1, 'QUESTION_LIBRARY', '系统内置');
+INSERT INTO `sys_role` VALUES (8, NULL, NULL, '命题老师', 1, 'QUESTION_TEACHER', NULL, NULL, NULL, NULL, 1, 'QUESTION_LIBRARY', '系统内置');
 
 INSERT INTO `sys_role_privilege` VALUES (1, 1, 1, 1);
 INSERT INTO `sys_role_privilege` VALUES (2, 1, 2, 1);
@@ -787,4 +789,10 @@ INSERT INTO `sys_role_privilege` VALUES (77, 5, 541, 1);
 INSERT INTO `sys_role_privilege` VALUES (78, 6, 492, 1);
 INSERT INTO `sys_role_privilege` VALUES (79, 6, 493, 1);
 INSERT INTO `sys_role_privilege` VALUES (80, 6, 541, 1);
-INSERT INTO `sys_role_privilege` VALUES (81, 1, 767, 1);
+INSERT INTO `sys_role_privilege` VALUES (81, 1, 767, 1);
+INSERT INTO `sys_role_privilege` VALUES (82, 7, 768, 1);
+INSERT INTO `sys_role_privilege` VALUES (83, 7, 769, 1);
+INSERT INTO `sys_role_privilege` VALUES (84, 7, 770, 1);
+INSERT INTO `sys_role_privilege` VALUES (85, 8, 768, 1);
+INSERT INTO `sys_role_privilege` VALUES (86, 8, 769, 1);
+INSERT INTO `sys_role_privilege` VALUES (87, 8, 770, 1);

+ 33 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/SsoController.java

@@ -57,16 +57,44 @@ public class SsoController {
         return ResultUtil.ok(map);
     }
 
+    @ApiOperation(value = "题库单点登录")
+    @ApiResponses({@ApiResponse(code = 200, message = "题库单点登录", response = Result.class)})
+    @RequestMapping(value = "/question_library_login", method = RequestMethod.POST)
+    public Result questionLibraryLogin(@ApiParam(value = "登录名", required = true) @RequestParam String loginName,
+                                       @ApiParam(value = "角色", required = true) @RequestParam RoleTypeEnum role,
+                                       @ApiParam(value = "返回url") @RequestParam(required = false) String returnUrl,
+                                       @ApiParam(value = "其它参数") @RequestParam(required = false) String params) throws IOException {
+        if (Objects.isNull(loginName) || Objects.equals(loginName, "")) {
+            throw ExceptionResultEnum.PARAMS_ERROR.exception("登录名不能为空");
+        }
+        if (Objects.isNull(role)) {
+            throw ExceptionResultEnum.PARAMS_ERROR.exception("角色不能为空");
+        }
+        if (role != RoleTypeEnum.SUBJECT_TEACHER && role != RoleTypeEnum.QUESTION_TEACHER) {
+            throw ExceptionResultEnum.ERROR.exception("角色类型超出限制");
+        }
+        return ResultUtil.ok(ssoService.questionLibraryLogin(loginName, role, returnUrl, params));
+    }
+
     @ApiOperation(value = "教研分析单点登录")
-    @ApiResponses({@ApiResponse(code = 200, message = "教研分析单点登录", response = Objects.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "教研分析单点登录", response = Result.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 {
+                                @ApiParam(value = "真实名") @RequestParam(required = false) String realName,
+                                @ApiParam(value = "手机号码") @RequestParam(required = false) String mobileNumber,
+                                @ApiParam(value = "是否启用") @RequestParam(required = false) Boolean enable,
+                                @ApiParam(value = "返回url") @RequestParam(required = false) String returnUrl) throws IOException {
+        if (Objects.isNull(loginName) || Objects.equals(loginName, "")) {
+            throw ExceptionResultEnum.PARAMS_ERROR.exception("登录名不能为空");
+        }
+        if (Objects.isNull(role)) {
+            throw ExceptionResultEnum.PARAMS_ERROR.exception("角色不能为空");
+        }
+        if (Objects.isNull(orgName) || Objects.equals(orgName, "")) {
+            throw ExceptionResultEnum.PARAMS_ERROR.exception("学院名称不能为空");
+        }
         if (role != RoleTypeEnum.OFFICE_TEACHER && role != RoleTypeEnum.PRESIDENT && role != RoleTypeEnum.TEACHER) {
             throw ExceptionResultEnum.ERROR.exception("角色类型超出限制");
         }

+ 8 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -125,6 +125,14 @@ public class SystemConstant {
     public static final String EXCEL_PROTECT_KEY = "Qmth87863577";
     public static final String ZIP_ENCRYPT_PWD = "qmthzip";
     public static final String GET = "get";
+    public static final String PARAMS = "params";
+    public static final String RETURN_URL = "returnUrl";
+    public static final String SIGNATURE = "signature";
+    public static final String GET_UNKNOWN = "?";
+    public static final String GET_SYMBOL = "&";
+    public static final String GET_EQUAL = "=";
+    public static final String PATH_MATCH = "*";
+    public static final String PATH_SUBSTR = "/#";
 
     /**
      * oss url过期时间

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/RoleSourceEnum.java

@@ -11,7 +11,8 @@ public enum RoleSourceEnum {
 
     SYS("系统自带"),
     ANALYSIS("教研分析"),
-    CLOUD_MARK("云阅卷");
+    CLOUD_MARK("云阅卷"),
+    QUESTION_LIBRARY("题库");
 
     RoleSourceEnum(String desc) {
         this.desc = desc;

+ 3 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/RoleTypeEnum.java

@@ -16,8 +16,9 @@ public enum RoleTypeEnum {
     PRESIDENT("学院院长"),
     TEACHER("任课老师"),
     MARKER("评卷员"),
-    MARKER_LEADER("科组长")
-    ;
+    MARKER_LEADER("科组长"),
+    SUBJECT_TEACHER("学科老师"),
+    QUESTION_TEACHER("命题老师");
 
     RoleTypeEnum(String desc) {
         this.desc = desc;