diff --git a/web/src/main/java/com/ibeetl/jlw/entity/LoginTodo.java b/web/src/main/java/com/ibeetl/jlw/entity/LoginTodo.java new file mode 100644 index 00000000..cc9a0327 --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/entity/LoginTodo.java @@ -0,0 +1,100 @@ +package com.ibeetl.jlw.entity; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ibeetl.admin.core.entity.CoreUser; +import lombok.*; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 功能描述:
+ * 第三方登录封装实体 + * + * @Author: lx + * @Date: 2022/12/11 14:56 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class LoginTodo implements Serializable { + + private static final long serialVersionUID = 1257693451422916110L; + + /** + * 账号(一般是#{@link CoreUser#getCode}) + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 角色ID 3老师 4学生 + */ + private ThirdRole roleid; + /** + * 教师ID + */ + private String teacherid; + /** + * 学生ID + */ + private String studentid; + /** + * 账号(一般是#{@link CoreUser#getName}) + */ + private String name; + /** + * 性别 + */ + private String sex; + /** + * 学校(院校) + */ + private String school; + /** + * 院系 + */ + private String college; + /** + * 专业 + */ + private String major; + /** + * 班级 + */ + @JsonProperty("class") + private String schoolclass; + /** + * 学生学号 + */ + private String studentNo; + + /** + * 第三方系统中定义的权限ID + * 3老师 4学生 + */ + @Getter + @RequiredArgsConstructor + public enum ThirdRole { + TEACHER_ROLE("3"), STUDENT_ROLE("4"); + + @JsonValue + final private String code; + } + + /** + * 转换成JSON格式 + * @return + */ + @SneakyThrows + public String toJSONString() { + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(this); + } +} \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/service/LoginTodoService.java b/web/src/main/java/com/ibeetl/jlw/service/LoginTodoService.java new file mode 100644 index 00000000..e063bda5 --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/service/LoginTodoService.java @@ -0,0 +1,127 @@ +package com.ibeetl.jlw.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ibeetl.admin.core.entity.CoreUser; +import com.ibeetl.jlw.dao.StudentDao; +import com.ibeetl.jlw.dao.TeacherDao; +import com.ibeetl.jlw.entity.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; + +import java.util.List; +import java.util.function.Consumer; + +import static cn.jlw.util.CacheUserUtil.getStudent; +import static cn.jlw.util.CacheUserUtil.getTeacher; +import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUser; +import static com.ibeetl.jlw.enums.GenderEnum.UN_KNOW; + +/** + * 功能描述:
+ * 第三方应用,登录Service + * @author: mlx + * @description: + * @date: 2022/12/11 15:35 + * @version: 1.0 + */ +@Service +@Transactional +@Validated +public class LoginTodoService { + + @Autowired private TeacherDao teacherDao; + @Autowired private StudentDao studentDao; + /** + * 功能描述:
+ * 设置学生信息 + * + * @param student 登录的学生信息 + * @param coreUser 登录用户信息 + * @param consumer 后置处理 + * @return + * @Author: lx + * @Date: 2022/12/11 15:33 + */ + public LoginTodo buildStudentLoginTodo(Student student, CoreUser coreUser, Consumer consumer) { + + Assert.isTrue(ObjectUtil.isAllNotEmpty(student, coreUser), "登录的用户信息不能为空!"); + Long studentId = student.getStudentId(); + List studentExtendInfoList = studentDao.getStudentExtendSchoolInfo(studentId.toString()); + StudentExtendSchoolInfo first = CollectionUtil.getFirst(studentExtendInfoList); + Assert.notNull(first, "未获取到院校信息!"); + // 类型为未知 时候,传递null + String gender = UN_KNOW.equals(student.getStudentGender()) || student.getStudentGender() == null ? null : student.getStudentGender().getText(); + + LoginTodo loginTodo = LoginTodo.builder().username(coreUser.getCode()) + .password(coreUser.getPassword()) + .roleid(LoginTodo.ThirdRole.STUDENT_ROLE) + .studentid(student.getStudentId().toString()) + .name(coreUser.getName()).sex(gender) + .school(first.getUniversitiesCollegesName()) + .college(first.getUniversityFacultyName()) + .major(first.getUniversitySystemName()) + .schoolclass(first.getClassName()) + .studentNo(student.getStudentSn()) + .build(); + consumer.accept(loginTodo); + return loginTodo; + } + + /** + * 功能描述:
+ * 设置教师信息 + * + * @param teacher 登录的教师信息 + * @param coreUser 登录用户信息 + * @param consumer 后置处理 + * @return + * @Author: lx + * @Date: 2022/12/11 15:33 + */ + public LoginTodo buildTeacherLoginTodo(Teacher teacher, CoreUser coreUser, Consumer consumer) { + + Assert.isTrue(ObjectUtil.isAllNotEmpty(teacher, coreUser), "登录的用户信息不能为空!"); + + Long teacherId = teacher.getTeacherId(); + List teacherExtendInfoList = teacherDao.getTeacherExtendSchoolInfo(teacherId.toString()); + TeacherExtendSchoolInfo first = CollectionUtil.getFirst(teacherExtendInfoList); + Assert.notNull(first, "未获取到院校信息!"); + + // 类型为未知 时候,传递null + String gender = UN_KNOW.equals(teacher.getTeacherGender()) || teacher.getTeacherGender() == null ? null : teacher.getTeacherGender().getText(); + + LoginTodo loginTodo = LoginTodo.builder().username(coreUser.getCode()) + .password(coreUser.getPassword()) + .roleid(LoginTodo.ThirdRole.TEACHER_ROLE) + .teacherid(teacherId.toString()) + .name(coreUser.getName()).sex(gender) + .school(first.getUniversitiesCollegesName()) + .college(first.getUniversityFacultyName()) + .major(first.getUniversitySystemName()) + .build(); + consumer.accept(loginTodo); + return loginTodo; + } + + /** + * 功能描述:
+ * 根据当前登录用户,来生成第三方应用登录信息 + * @return {@link LoginTodo} + * @Author: lx + * @Date: 2022/12/11 15:45 + */ + public LoginTodo buildByCurrentLoginUser() { + CoreUser user = getUser(); + if (user.isStudent()) { + return buildStudentLoginTodo(getStudent(), user, (e)->{}); + } + else if (user.isTeacher()) { + return buildTeacherLoginTodo(getTeacher(), user, (e)->{}); + } + return null; + } +} diff --git a/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java b/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java index 06e9efd8..be69f22c 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/ResourcesApplicationService.java @@ -1,15 +1,23 @@ package com.ibeetl.jlw.service; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.DecodedJWT; import com.ibeetl.admin.core.service.CoreBaseService; import com.ibeetl.admin.core.util.PlatformException; import com.ibeetl.jlw.dao.ResourcesApplicationCourseDao; import com.ibeetl.jlw.dao.ResourcesApplicationDao; import com.ibeetl.jlw.dao.UniversitiesCollegesJurisdictionExperimentalSystemDao; +import com.ibeetl.jlw.entity.LoginTodo; import com.ibeetl.jlw.entity.ResourcesApplication; import com.ibeetl.jlw.entity.UniversitiesCollegesJurisdictionExperimentalSystem; import com.ibeetl.jlw.web.query.ResourcesApplicationQuery; @@ -22,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotNull; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -44,6 +53,8 @@ public class ResourcesApplicationService extends CoreBaseServicequeryByCondition(PageQuery query){ PageQuery ret = resourcesApplicationDao.queryByCondition(query); @@ -196,7 +207,71 @@ public class ResourcesApplicationService extends CoreBaseService queryMyApplicationByConditionQuery(PageQuery query) { PageQuery ret = resourcesApplicationDao.queryMyApplicationByConditionQuery(query); - queryListAfter(ret.getList()); + List list = ret.getList(); + CollectionUtil.emptyIfNull(list).forEach(item -> { + String applicationLink = item.getApplicationLink(); + applicationLink = makeHaveKeyStr(applicationLink); + String realUrl = applicationLink.concat(getKeyByCurrentUser(item.getLinkSecretKey())); + item.set("realUrl", realUrl); + }); + queryListAfter(list); return ret; } + + /** + * 功能描述:
+ * 通过应用设置的Key来生成Jwt串,用于等于第三方应用 + * + * @param linkSecretKey 链接的加密串 + * @return {@link String} + * @Author: lx + * @Date: 2022/12/11 16:59 + */ + public String getKeyByCurrentUser(String linkSecretKey) { + if (ObjectUtil.isNotEmpty(linkSecretKey)) { + LoginTodo loginTodo = loginTodoService.buildByCurrentLoginUser(); + return JWT.create().withAudience(loginTodo.toJSONString()).sign(Algorithm.HMAC256(linkSecretKey)); + } + return ""; + } + + /** + * 功能描述:
+ * 解密加密的url,用于第三方应用 + * + * @param linkSecretKey 应用密钥 + * @param url 生成key以后,得到的 applicationLink + 加密后的jwt串。 + * @Author: lx + * @Date: 2022/12/11 17:06 + */ + public void decodeApplicationUrl(String linkSecretKey, String url) { + + JWTVerifier verifier = JWT.require(Algorithm.HMAC256(linkSecretKey)).build(); + DecodedJWT jwt = verifier.verify(url); + System.out.println(jwt.getAudience().get(0)); + } + + /** + * 功能描述:
+ * 用户如果输入的链接地址,不包含key= 字符的话,则自动追加 + * + * @param link + * @return {@link String} + * @Author: lx + * @Date: 2022/12/11 17:21 + */ + public String makeHaveKeyStr(String link) { + final String key = "key=", sequence = "?"; + String query = URLUtil.toURI(link).getQuery(); + boolean isHaveKey = Arrays.stream(query.split("&")).anyMatch(item -> item.contains(key)); + if (ObjectUtil.isNotEmpty(link) && !isHaveKey) { + if (link.contains(sequence)) { + return StrUtil.format("{}&{}", link, key); + } + else { + return StrUtil.format("{}?{}", link, key); + } + } + return link; + } } \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/web/IndexController.java b/web/src/main/java/com/ibeetl/jlw/web/IndexController.java index 7cf03a7e..12c2b117 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/IndexController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/IndexController.java @@ -113,100 +113,11 @@ public class IndexController { return JsonResult.success(TimeTool.getNowTime()); } - - private static class LoginTodo { - private String username; //账号 - private String password; //密码 - private String roleid; //角色ID - private String teacherid; //教师ID - private String studentid; //学生ID - private String name; //姓名 - private String sex; //性别 - private String school; //学校 - private String college; //院校 - private String major; //专业 - private String schoolclass; //班级 - private String studentNo;//学号 - - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getPassword() { - return password; - } - public void setPassword(String password) { - this.password = password; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String getSex() { - return sex; - } - public void setSex(String sex) { - this.sex = sex; - } - public String getSchool() { - return school; - } - public void setSchool(String school) { - this.school = school; - } - public String getCollege() { - return college; - } - public void setCollege(String college) { - this.college = college; - } - public String getMajor() { - return major; - } - public void setMajor(String major) { - this.major = major; - } - public String getSchoolclass() { - return schoolclass; - } - public void setSchoolclass(String schoolclass) { - this.schoolclass = schoolclass; - } - public String getStudentNo() { - return studentNo; - } - public void setStudentNo(String studentNo) { - this.studentNo = studentNo; - } - public String getRoleid() { - return roleid; - } - public void setRoleid(String roleid) { - this.roleid = roleid; - } - public String getTeacherid() { - return teacherid; - } - public void setTeacherid(String teacherid) { - this.teacherid = teacherid; - } - public String getStudentid() { - return studentid; - } - public void setStudentid(String studentid) { - this.studentid = studentid; - } - } - public static void main(String[] args){ LoginTodo loginTodo = new LoginTodo(); loginTodo.setUsername("测试教师"); loginTodo.setPassword("123qwe"); - loginTodo.setRoleid("3"); + loginTodo.setRoleid(LoginTodo.ThirdRole.TEACHER_ROLE); loginTodo.setTeacherid("1"); loginTodo.setStudentid(null); loginTodo.setName("测试教师"); diff --git a/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java b/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java index dbcc1f57..221fe2da 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/ResourcesApplicationController.java @@ -7,6 +7,7 @@ import com.ibeetl.admin.core.file.FileService; import com.ibeetl.admin.core.service.CorePlatformService; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.jlw.entity.ResourcesApplication; +import com.ibeetl.jlw.service.LoginTodoService; import com.ibeetl.jlw.service.ResourcesApplicationService; import com.ibeetl.jlw.web.query.ResourcesApplicationQuery; import org.apache.commons.logging.Log; @@ -37,6 +38,7 @@ public class ResourcesApplicationController{ @Autowired private ResourcesApplicationService resourcesApplicationService; @Autowired private CorePlatformService platformService; + @Autowired private LoginTodoService loginTodoService; @Autowired FileService fileService; @@ -156,4 +158,19 @@ public class ResourcesApplicationController{ return JsonResult.success(page); } } + + /** + * 功能描述:
+ * 获取第三方登录时候用到的实体信息,加密前的实体。 + * 只允许教师和学生身份。 + * + * @return {@link JsonResult} + * @Author: lx + * @Date: 2022/12/11 17:29 + */ + @GetMapping(API + "/getLoginTodo.do") + @ResponseBody + public JsonResult getLoginTodo() { + return JsonResult.success(loginTodoService.buildByCurrentLoginUser()); + } }