提交修改

This commit is contained in:
daihh
2023-03-23 13:01:11 +08:00
parent 6c2d474b18
commit df96fd4dc7
12 changed files with 95 additions and 294 deletions

View File

@@ -17,6 +17,11 @@
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.xboe</groupId>
<artifactId>xboe-api</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.xboe</groupId>
<artifactId>xboe-module-scorm</artifactId>

View File

@@ -0,0 +1,50 @@
package com.xboe;
import java.util.HashSet;
import java.util.Set;
import org.springframework.stereotype.Component;
import com.xboe.api.IUrlSecurityFilter;
/**
* 对url的过滤处理.
* 此服务全部需要
*
*/
@Component
public class UrlSecurityFilterImpl implements IUrlSecurityFilter{
private static Set<String> noLoginUrls=new HashSet<String>();
static {
noLoginUrls.add("/inner/data");
noLoginUrls.add("/xboe/account/captcha");
noLoginUrls.add("/xboe/account/login");
noLoginUrls.add("/xboe/account/boelogin");
noLoginUrls.add("/xboe/account/mobile-login");
noLoginUrls.add("/xboe/account/logout");
noLoginUrls.add("/xboe/system/captcha");
noLoginUrls.add("/xboe/system/login");
noLoginUrls.add("/xboe/system/logout");
noLoginUrls.add("/xboe/sys/user/sync-all");
//noLoginUrls.add("");
}
@Override
public boolean requireLogin(String url) {
for(String str : noLoginUrls) {
if(url.startsWith(str)) {
return false;
}
}
if(!url.startsWith("/xboe/") && !url.startsWith("/api/")){
return false;
}
return true;
}
}

View File

@@ -829,6 +829,7 @@ public class CourseManageApi extends ApiBaseController{
if(StringUtils.isBlank(id)){
return badRequest("参数错误");
}
CurrentUser cuser=getCurrent();
try {
String mess = courseService.copyCourse(id,refId,refType);
if(StringUtils.isBlank(mess)){

View File

@@ -367,11 +367,10 @@ public class CourseServiceImpl implements ICourseService {
filters.add(FieldFilters.eq("deleted",false));
filters.add(FieldFilters.eq("enabled",true));
//返回的结果
QueryBuilder query=QueryBuilder.from(Course.class).addFilters(filters);
if(dto.getTopOrder()!=null) {
if(dto.getTopOrder()!=null){
if(dto.getTopOrder()){
query.addOrder(OrderCondition.desc("isTop"));
query.addOrder(OrderCondition.desc("topTime"));

View File

@@ -12,12 +12,10 @@ import com.xboe.account.entity.Account;
import com.xboe.account.service.IAccountService;
import com.xboe.common.utils.StringUtil;
import com.xboe.core.CurrentUser;
import com.xboe.core.IAuthorizationToken;
import com.xboe.core.JsonResponse;
import com.xboe.core.api.ApiBaseController;
import com.xboe.data.dto.UserData;
import com.xboe.data.outside.IOutSideDataService;
import com.xboe.module.teacher.entity.Teacher;
import com.xboe.module.teacher.service.ITeacherService;
import com.xboe.system.organization.entity.Organization;
import com.xboe.system.organization.service.IOrganizationService;
@@ -35,9 +33,6 @@ import lombok.extern.slf4j.Slf4j;
@RequestMapping(value = "/xboe/portal")
public class PortalConsoleApi extends ApiBaseController{
@Autowired
IAuthorizationToken authorizationToken;
@Autowired
IUserService userService;
@@ -61,7 +56,8 @@ public class PortalConsoleApi extends ApiBaseController{
public JsonResponse<Map<String,Object>> init() {
Map<String,Object> map=new HashMap<String,Object>();
try {
Account account = accountService.get(getCurrent().getAccountId());
CurrentUser cuser=getCurrent();
Account account = accountService.get(cuser.getAccountId());
if(account==null) {
log.error("未找到账号id【"+getCurrent().getAccountId()+"】对应的用户");
return error("账号错误,无此账号");

View File

@@ -5,7 +5,6 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Component;
@@ -14,6 +13,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.xboe.common.utils.Sha256Mac;
import com.xboe.core.IAuthorizationToken;
import lombok.extern.slf4j.Slf4j;
/**
* token 与原boe系统相同的生成解析规则
*
@@ -37,7 +38,7 @@ public class BoeTokenImpl implements IAuthorizationToken{
//long iat=System.currentTimeMillis()/1000;
long iat=System.currentTimeMillis()/1000;
payloadMap.put("iat", iat);
long exp=iat+(12*60*60);//过期时间,12个小时过期
long exp=iat+(2*60*60);//过期时间,2个小时过期
payloadMap.put("exp", exp);
payloadMap.put("GivenName", "boeu");
payloadMap.put("permission","");
@@ -97,10 +98,11 @@ public class BoeTokenImpl implements IAuthorizationToken{
}
// public static void main(String[] args) {
//
//// Map<String,String> data=new HashMap<String,String>();
//// data.put("userId","DFF192E1-FB7B-11EC-9DDF-005056BD9028");//原系统id
//// data.put("name", "测试账号0001");
////
// Map<String,String> data=new HashMap<String,String>();
// data.put("userId","DFF192E1-FB7B-11EC-9DDF-005056BD9028");//原系统id
// data.put("uId", "二期新增加的id");
// data.put("name", "测试账号0001");
////
//// try {
////
@@ -110,18 +112,19 @@ public class BoeTokenImpl implements IAuthorizationToken{
//// }catch(Exception e) {
//// e.printStackTrace();
//// }
//
////
// try {
//
// BoeTokenImpl impl=new BoeTokenImpl();
//// String token=impl.createToken(data);
//// System.out.println(token);
// String token=impl.createToken(data);
// System.out.println(token);
////
//// Map<String,String> tokenData = impl.readToken(token);
//
//
// String token="eyJ0eXBlIjoidG9rZW4iLCJhbGciOiJIUzI1NiJ9.eyJ1SWQiOiI5NTI5NDg2MjY0OTc3MjQ0MTEiLCJ1c2VyTm8iOiIxMjM0NTYwMSIsImlzcyI6Imh0dHA6Ly91LmJvZS5jb20iLCJuYW1lIjoi5Luj5rW35YW0IiwiR2l2ZW5OYW1lIjoiYm9ldSIsImRlcGFydElkIjoiOTg0MTQ3NTY2NTIxNjY3NTg0IiwicGVybWlzc2lvbiI6IiIsImV4cCI6MTY3NTc4MTQwMSwiaWF0IjoxNjc1NzM4MjAxLCJhaWQiOiI5NTI5NDg2MjY0OTc3MjQ0MTEiLCJ1c2VySWQiOiIwMTU1NTNERC00NDVFLTY5RDQtMzUxRi1ERDlBMUE1NjQyMEUifQ==.d1d8d3e53ece04a8a863d5f0a3c227cea559cc4cfcbc9010a1125f7a11d6e9a0";
// //String token="eyJhbGciOiJIUzI1NiIsInR5cGUiOiJ0b2tlbiJ9.eyJpc3MiOiJodHRwOi8vdS5ib2UuY29tIiwiR2l2ZW5OYW1lIjoiYm9ldSIsInVJZCI6OTY1MzQxOTk5NjQzMjM0MzA0LCJ1c2VySWQiOiIwMTU1NTNERC00NDVFLTY5RDQtMzUxRi1ERDlBMUE1NjQyMEUiLCJleHAiOjE2NzkzNjcwOTc1NDF9.1758ccba02926f5e790743857e11f0fc89238cb9c30024530b5d4b3ff8387ad2";
// //String token = "eyJhbGciOiJIUzI1NiIsInR5cGUiOiJ0b2tlbiJ9.eyJpc3MiOiJodHRwOi8vdS5ib2UuY29tIiwiR2l2ZW5OYW1lIjoiYm9ldSIsInVJZCI6OTY1MzQyMDI3NDk3NjA3MTY4LCJ1c2VySWQiOiI2QjA0OUZBRi1DMzE0LTdDQ0YtMEQyOC0wRDIzRjRDNDI1MzEiLCJleHAiOjE2NzU3NTU4ODYzMzV9.c65d86ccc5feb1c820490d94196f5509b6bb97dce748bc590160c6d8489bde6a";
// //Map<String,String> map = impl.readToken(token);
// String[] tokens = token.split("\\.");
// System.out.println(tokens.length);
// String header = new String(Base64.decodeBase64(tokens[0]));
@@ -136,12 +139,13 @@ public class BoeTokenImpl implements IAuthorizationToken{
// JsonNode json = om.readTree(payload);
// System.out.println(json);
// String userId=json.get("userId").asText();
// String uId=json.get("uId").asText();
// long exp=json.get("exp").asLong();
// System.out.println("userId="+userId+",exp="+exp);
// System.out.println("userId="+userId+",uId="+uId+",exp="+exp);
// }catch(Exception e) {
// e.printStackTrace();
// }
//
////
// }
}

View File

@@ -1,30 +0,0 @@
package com.xboe.school.impl;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.xboe.core.CurrentUser;
import com.xboe.core.IGetCurrentUser;
import com.xboe.core.SysConstant;
/**
* 获取当前用户的信息接口的实现
*/
@Component
public class GetCurrentUserImpl implements IGetCurrentUser{
@Override
public CurrentUser get() {
// 如果接口不是从action进入就会没有这些信息
if(RequestContextHolder.getRequestAttributes() == null){
return null;
}
HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
CurrentUser info=(CurrentUser)req.getAttribute(SysConstant.KEY_CURRENT_LOGIN_USER);
return info;
}
}

View File

@@ -1,72 +0,0 @@
package com.xboe.school.impl;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator.Builder;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.xboe.core.IAuthorizationToken;
/**
* 认证token的jwt实现,生成和解析jwt
*/
//@Component
public class JwtTokenImpl implements IAuthorizationToken {
private static String jwtIssuer = "xboe";
//private static String SignKey="$J#F@f3@7G!D";
private static String SignKey = "JDF_BOE";//采用与原系统保持一致
@Override
public String createToken(Map<String, String> params) throws Exception {
HashMap<String, Object> map = new HashMap<>(); //自定义header
Calendar insCalendar = Calendar.getInstance();
insCalendar.add(Calendar.SECOND, 12 * 60 * 60); //存储时间为800s// 指令令牌过期时间
Builder signBuilder = JWT.create().withHeader(map).withExpiresAt(insCalendar.getTime());
signBuilder.withIssuer(jwtIssuer).withSubject("subject");//谁创建了令牌并签署了它
for (String key : params.keySet()) {
signBuilder.withClaim(key, params.get(key));
}
String sign = signBuilder.sign(Algorithm.HMAC256(SignKey));// 签名
//System.out.println(sign);
return sign;
}
@Override
public Map<String, String> readToken(String token) throws Exception {
//System.out.println(token);
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SignKey)).build();
DecodedJWT verify = jwtVerifier.verify(token);
//System.out.println("token过期时间:"+verify.getExpiresAt());
// 时间过期返回null
Calendar insCalendar = Calendar.getInstance();
if (insCalendar.getTime().before(verify.getExpiresAt())) {
Map<String, Claim> map = verify.getClaims();
Map<String, String> result = new HashMap<String, String>();
for (String key : map.keySet()) {
String value = map.get(key).asString();
result.put(key, value);
//System.out.print(key+"="+value);
}
return result;
}
return null;
}
}

View File

@@ -28,6 +28,7 @@ public class StudyCourseDao extends BaseDao<StudyCourse> {
* @param total
*/
public void finishCheck(String studyId,String courseId,Integer total){
LocalDateTime now=LocalDateTime.now();
//已完成的内容
int n=scItemDao.count(FieldFilters.eq("studyId",studyId),FieldFilters.eq("status",StudyCourseItem.STATUS_FINISH));
if(total==null) {
@@ -40,7 +41,8 @@ public class StudyCourseDao extends BaseDao<StudyCourse> {
//自主报名的课程,代表学习完成
super.updateMultiFieldById(studyId,
UpdateBuilder.create("progress",100f),
UpdateBuilder.create("lastTime",LocalDateTime.now()),
UpdateBuilder.create("lastTime",now),
UpdateBuilder.create("finishTime",now),
UpdateBuilder.create("status",StudyCourse.STATUS_FINISH));
}else {
super.updateMultiFieldById(studyId,

View File

@@ -158,12 +158,25 @@ public class StudyServiceImpl implements IStudyService{
@Transactional
public void updateProcess(String studyContentId,String studyId, String courseId,Integer total, Integer progress) {
int status=StudyCourseItem.STATUS_STUDYING;
LocalDateTime now=LocalDateTime.now();
if(progress.intValue()==100) {
status=StudyCourseItem.STATUS_FINISH;
scItemDao.updateMultiFieldById(studyContentId,
UpdateBuilder.create("progress",progress),
UpdateBuilder.create("lastTime",now),
UpdateBuilder.create("finishTime",now),
UpdateBuilder.create("status",status));
//检查是否全部学习完成
scDao.finishCheck(studyId,courseId,total);
}else {
scItemDao.updateMultiFieldById(studyContentId,
UpdateBuilder.create("progress",progress),
UpdateBuilder.create("lastTime",now),
UpdateBuilder.create("status",status));
}
scItemDao.updateMultiFieldById(studyContentId,UpdateBuilder.create("progress",progress),UpdateBuilder.create("status",status));
//检查是否全部学习完成
scDao.finishCheck(studyId,courseId,total);
}

View File

@@ -1,168 +0,0 @@
package com.xboe.system.filter;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xboe.core.CurrentUser;
import com.xboe.core.JsonResponse;
import com.xboe.core.api.TokenProxy;
import com.xboe.standard.BaseConstant;
import com.xboe.system.user.entity.User;
import com.xboe.system.user.service.IUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* 认证过滤器
*/
@Component
@Order(100)
public class AuthenticationFilter extends OncePerRequestFilter {
// private static String urls="/xboe";
// @Autowired(required = false)
// ICurrentUserStorage storage;
//
// @Autowired(required = false)
// private IApiUrlSecurityFilter urlFilters;
@Autowired
IUserService userService;
// @Autowired
// IAuthorizationToken authorizationToken;
// @Override
// public void destroy() {
//
// }
private void error(HttpServletResponse response,int code,String message) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonResponse<String> rr = new JsonResponse<String>();
rr.setStatus(code);
rr.setMessage(message);
String json = mapper.writeValueAsString(rr);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
response.getWriter().write(json);
response.flushBuffer();
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {
String url = request.getServletPath();
//当前先写固定的url判断
//以下是针对于url规划的判断这里简写
if(url.startsWith("/inner/data") || url.startsWith("/xboe/account/captcha") || url.startsWith("/xboe/account/login") || url.startsWith("/xboe/account/boelogin") || url.startsWith("/xboe/account/mobile-login") || url.startsWith("/xboe/account/logout") || url.startsWith("/xboe/system/captcha") || url.startsWith("/xboe/system/logout") || url.startsWith("/xboe/system/login") || url.startsWith("/xboe/sys/user/sync-all")){
filterChain.doFilter(request, response);
return;
}
if(!url.startsWith("/xboe/") && !url.startsWith("/api/")){
filterChain.doFilter(request, response);
}else {
String token = TokenProxy.getToken(request);
//System.out.println("token="+token);
if(StringUtils.isBlank(token)){
error(response,401,"您还未登录,请重新登录");
return;
}
//检查token的格式
Map<String, String> tokenData;
try {
//System.out.println("token");
//System.out.println(token);
tokenData = TokenProxy.instance().readToken(token);
if(tokenData==null) {
error(response,401,"您还未登录或登录已超时,请重新登录");
return;
}
CurrentUser cuser=convertByMap(tokenData);
//先从tokenData中读取如果没有再到存储中读取如果都没有就返回未登录的错误
//当前没有在本地做存储,所以这里不再做处理
// if(cuser==null) {
// if(storage!=null) {
// cuser=storage.read(request,token);
// }
// }
if(cuser==null) {
// 判断token中获取的值是否当前系统的不是则告诉前端来获取
if(tokenData.containsKey("uId")) {
error(response,302,"token 错误");
return;
}
error(response,401,"请重新登录");
return;
}
// String levelStr=tokenData.get("alevel");
// if(levelStr!=null) {
// request.setAttribute(XaskConstant.KEY_CURRENT_API_LEVEL,Integer.valueOf(levelStr));
// }else {
// request.setAttribute(XaskConstant.KEY_CURRENT_API_LEVEL,0);
// }
request.setAttribute(BaseConstant.KEY_CURRENT_LOGIN_USER,cuser);
filterChain.doFilter(request, response);
} catch (Exception e) {
// e.printStackTrace();
error(response,401,"请重新登录");
return;
}
}
}
private CurrentUser convertByMap(Map<String, String> data) {
if(!data.containsKey("aid")) {
//修改为新的接口通过uId获取
if(data.containsKey("uId")) {
User user = userService.get(data.get("uId"));
if(user != null){
CurrentUser cuser=new CurrentUser();
cuser.setAccountId(user.getId());
cuser.setName(user.getName());
cuser.setCode(user.getUserNo());
cuser.setDepartId(user.getDepartId());
return cuser;
}else {
return null;
}
}
// if(data.containsKey("userId")) {
// User user = userService.getBySysId(data.get("userId"));
// if(user != null){
// CurrentUser cuser=new CurrentUser();
// cuser.setAccountId(user.getId());
// cuser.setName(user.getName());
// cuser.setCode(user.getUserNo());
// cuser.setDepartId(user.getDepartId());
// return cuser;
// }else {
// return null;
// }
// }
return null;
}
//此处用于本地登录的情况直接从token中获取不需要再查询一次了
CurrentUser cuser=new CurrentUser();
cuser.setAccountId(data.get("aid"));
cuser.setName(data.get("name"));
cuser.setCode(data.get("userNo"));
// cuser.setOrgId(data.get("orgId"));
cuser.setDepartId(data.get("departId"));
return cuser;
}
}

View File

@@ -43,6 +43,7 @@ xboe.externalinterface.url.system=http://localhost:9091
## 新增加的教师的内部调用接口
xboe.old.base.url=https://u-pre.boe.com
# 用户中心的接口配置
xboe.server.userbasic.url=https://u-pre.boe.com/userbasic
## 用户统计接口的api地址