diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 621b4d1f..e0f2844b 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -17,6 +17,11 @@ 1.8 + + com.xboe + xboe-api + 1.0.0 + com.xboe xboe-module-scorm diff --git a/servers/boe-server-all/src/main/java/com/xboe/UrlSecurityFilterImpl.java b/servers/boe-server-all/src/main/java/com/xboe/UrlSecurityFilterImpl.java new file mode 100644 index 00000000..23288a2c --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/UrlSecurityFilterImpl.java @@ -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 noLoginUrls=new HashSet(); + + 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; + } + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java index f64c33b2..d26db95e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java @@ -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)){ diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java index fd0e5cff..374641ed 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java @@ -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")); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/api/PortalConsoleApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/api/PortalConsoleApi.java index b3ba7f74..9ced8b26 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/api/PortalConsoleApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/api/PortalConsoleApi.java @@ -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> init() { Map map=new HashMap(); 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("账号错误,无此账号"); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/impl/BoeTokenImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/impl/BoeTokenImpl.java index 1471896a..fb4683b5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/impl/BoeTokenImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/impl/BoeTokenImpl.java @@ -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 data=new HashMap(); -//// data.put("userId","DFF192E1-FB7B-11EC-9DDF-005056BD9028");//原系统id -//// data.put("name", "测试账号0001"); +//// +// Map data=new HashMap(); +// 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 tokenData = impl.readToken(token); // // -// String token="eyJ0eXBlIjoidG9rZW4iLCJhbGciOiJIUzI1NiJ9.eyJ1SWQiOiI5NTI5NDg2MjY0OTc3MjQ0MTEiLCJ1c2VyTm8iOiIxMjM0NTYwMSIsImlzcyI6Imh0dHA6Ly91LmJvZS5jb20iLCJuYW1lIjoi5Luj5rW35YW0IiwiR2l2ZW5OYW1lIjoiYm9ldSIsImRlcGFydElkIjoiOTg0MTQ3NTY2NTIxNjY3NTg0IiwicGVybWlzc2lvbiI6IiIsImV4cCI6MTY3NTc4MTQwMSwiaWF0IjoxNjc1NzM4MjAxLCJhaWQiOiI5NTI5NDg2MjY0OTc3MjQ0MTEiLCJ1c2VySWQiOiIwMTU1NTNERC00NDVFLTY5RDQtMzUxRi1ERDlBMUE1NjQyMEUifQ==.d1d8d3e53ece04a8a863d5f0a3c227cea559cc4cfcbc9010a1125f7a11d6e9a0"; +// //String token="eyJhbGciOiJIUzI1NiIsInR5cGUiOiJ0b2tlbiJ9.eyJpc3MiOiJodHRwOi8vdS5ib2UuY29tIiwiR2l2ZW5OYW1lIjoiYm9ldSIsInVJZCI6OTY1MzQxOTk5NjQzMjM0MzA0LCJ1c2VySWQiOiIwMTU1NTNERC00NDVFLTY5RDQtMzUxRi1ERDlBMUE1NjQyMEUiLCJleHAiOjE2NzkzNjcwOTc1NDF9.1758ccba02926f5e790743857e11f0fc89238cb9c30024530b5d4b3ff8387ad2"; // //String token = "eyJhbGciOiJIUzI1NiIsInR5cGUiOiJ0b2tlbiJ9.eyJpc3MiOiJodHRwOi8vdS5ib2UuY29tIiwiR2l2ZW5OYW1lIjoiYm9ldSIsInVJZCI6OTY1MzQyMDI3NDk3NjA3MTY4LCJ1c2VySWQiOiI2QjA0OUZBRi1DMzE0LTdDQ0YtMEQyOC0wRDIzRjRDNDI1MzEiLCJleHAiOjE2NzU3NTU4ODYzMzV9.c65d86ccc5feb1c820490d94196f5509b6bb97dce748bc590160c6d8489bde6a"; +// //Map 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(); // } -// +//// // } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/impl/GetCurrentUserImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/impl/GetCurrentUserImpl.java deleted file mode 100644 index 6879cb3b..00000000 --- a/servers/boe-server-all/src/main/java/com/xboe/school/impl/GetCurrentUserImpl.java +++ /dev/null @@ -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; - } - -} diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/impl/JwtTokenImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/impl/JwtTokenImpl.java deleted file mode 100644 index 42d170f2..00000000 --- a/servers/boe-server-all/src/main/java/com/xboe/school/impl/JwtTokenImpl.java +++ /dev/null @@ -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 params) throws Exception { - - HashMap 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 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 map = verify.getClaims(); - Map result = new HashMap(); - for (String key : map.keySet()) { - String value = map.get(key).asString(); - result.put(key, value); - //System.out.print(key+"="+value); - } - - return result; - } - return null; - } - - - -} diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java index 0c943c27..2de719e8 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java @@ -28,6 +28,7 @@ public class StudyCourseDao extends BaseDao { * @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 { //自主报名的课程,代表学习完成 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, diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java index 1e9fe427..0f457a3e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java @@ -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); + + + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/system/filter/AuthenticationFilter.java b/servers/boe-server-all/src/main/java/com/xboe/system/filter/AuthenticationFilter.java deleted file mode 100644 index 51d33584..00000000 --- a/servers/boe-server-all/src/main/java/com/xboe/system/filter/AuthenticationFilter.java +++ /dev/null @@ -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 rr = new JsonResponse(); - 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 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 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; - } -} diff --git a/servers/boe-server-all/src/main/resources/application-dev.properties b/servers/boe-server-all/src/main/resources/application-dev.properties index c2fc13c6..3b9f7f30 100644 --- a/servers/boe-server-all/src/main/resources/application-dev.properties +++ b/servers/boe-server-all/src/main/resources/application-dev.properties @@ -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地址