DistributedPrintAuthenticationService.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package com.qmth.distributed.print.auth;
  2. import com.qmth.boot.core.enums.Platform;
  3. import com.qmth.boot.core.security.model.AccessEntity;
  4. import com.qmth.boot.core.security.service.AuthorizationService;
  5. import com.qmth.boot.tools.signature.SignatureType;
  6. import com.qmth.teachcloud.common.bean.auth.AuthBean;
  7. import com.qmth.teachcloud.common.config.DictionaryConfig;
  8. import com.qmth.teachcloud.common.contant.SystemConstant;
  9. import com.qmth.teachcloud.common.entity.SysUser;
  10. import com.qmth.teachcloud.common.entity.TBSession;
  11. import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
  12. import com.qmth.teachcloud.common.enums.PrivilegePropertyEnum;
  13. import com.qmth.teachcloud.common.enums.RoleTypeEnum;
  14. import com.qmth.teachcloud.common.service.AuthInfoService;
  15. import com.qmth.teachcloud.common.service.CommonCacheService;
  16. import com.qmth.teachcloud.common.util.RedisUtil;
  17. import com.qmth.teachcloud.common.util.ServletUtil;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.stereotype.Component;
  21. import javax.annotation.Resource;
  22. import javax.servlet.http.HttpServletRequest;
  23. import javax.servlet.http.HttpServletResponse;
  24. import java.util.Objects;
  25. import java.util.Set;
  26. @Component
  27. public class DistributedPrintAuthenticationService implements AuthorizationService {
  28. private final static Logger log = LoggerFactory.getLogger(DistributedPrintAuthenticationService.class);
  29. @Resource
  30. CommonCacheService commonCacheService;
  31. @Resource
  32. RedisUtil redisUtil;
  33. @Resource
  34. DictionaryConfig dictionaryConfig;
  35. @Resource
  36. AuthInfoService authInfoService;
  37. @Override
  38. public AccessEntity findByIdentity(String identity, SignatureType signatureType, String path) {
  39. return new DistributedPrintSession(identity, SignatureType.TOKEN);
  40. }
  41. @Override
  42. public boolean hasPermission(AccessEntity accessEntity, String path) {
  43. if (Objects.nonNull(accessEntity) && Objects.nonNull(accessEntity.getIdentity())) {
  44. TBSession tbSession = (TBSession) redisUtil.getUserSession(accessEntity.getIdentity());
  45. if (Objects.isNull(tbSession)) {
  46. log.warn("Authorization faile: session id not exists: {}", accessEntity.getIdentity());
  47. throw ExceptionResultEnum.NOT_LOGIN.exception();
  48. }
  49. if (tbSession.getExpireTime() <= System.currentTimeMillis()) {
  50. log.warn("Authorization faile: session has expired, expire time={}", tbSession.getExpireTime());
  51. throw ExceptionResultEnum.NOT_LOGIN.exception();
  52. }
  53. Platform platform = ServletUtil.getRequestPlatform();
  54. String deviceId = ServletUtil.getRequestDeviceId();
  55. if (!tbSession.getPlatform().equalsIgnoreCase(platform.name())) {
  56. log.warn("Authorization faile: platform invalid, session platform is {}", tbSession.getPlatform());
  57. throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
  58. }
  59. if (!tbSession.getDeviceId().equalsIgnoreCase(deviceId)) {
  60. log.warn("Authorization faile: deviceId invalid, session deviceId is {} ", tbSession.getDeviceId());
  61. throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
  62. }
  63. Long userId = Long.parseLong(tbSession.getIdentity());
  64. SysUser sysUser = commonCacheService.userCache(userId);
  65. HttpServletRequest request = ServletUtil.getRequest();
  66. HttpServletResponse response = ServletUtil.getResponse();
  67. request.setAttribute(SystemConstant.SESSION, tbSession);
  68. request.setAttribute(SystemConstant.USER, sysUser);
  69. boolean auth = authFootCommon(userId, SystemConstant.USER_OAUTH_CACHE, path, request, response);
  70. if (auth) {
  71. Long expireTime = redisUtil.getUserSessionExpire(accessEntity.getIdentity());
  72. if (Objects.nonNull(expireTime) && expireTime.longValue() > -1L) {
  73. if (Objects.nonNull(tbSession.getLastAccessTime()) && (System.currentTimeMillis() - tbSession.getLastAccessTime()) / 1000 > dictionaryConfig.sysDomain().getSessionActive().getSeconds()) {
  74. log.warn("Authorization faile: session active, session active is {}", dictionaryConfig.sysDomain().getSessionActive().getSeconds());
  75. throw ExceptionResultEnum.NOT_LOGIN.exception();
  76. }
  77. tbSession.setLastInfo();
  78. redisUtil.setUserSession(accessEntity.getIdentity(), tbSession, expireTime);
  79. }
  80. }
  81. return auth;
  82. }
  83. return false;
  84. }
  85. /**
  86. * 鉴权尾公用
  87. *
  88. * @param userId
  89. * @param type
  90. * @param path
  91. * @param request
  92. * @param response
  93. * @return
  94. */
  95. public boolean authFootCommon(Long userId,
  96. String type,
  97. String path,
  98. HttpServletRequest request,
  99. HttpServletResponse response) {
  100. //验证权限
  101. AuthBean authBean = type.contains(SystemConstant.USER_OAUTH_CACHE) ? authBean = commonCacheService.userAuthCache(userId) : null;
  102. if (Objects.isNull(authBean)) {
  103. throw ExceptionResultEnum.ROLE_ENABLE_AUTHORIZATION.exception();
  104. }
  105. request.setAttribute(SystemConstant.SCHOOL, authBean.getSchool());
  106. request.setAttribute(SystemConstant.ORG, authBean.getOrg());
  107. //超级系统管理员拥有所有权限
  108. int count = Objects.nonNull(authBean) ? (int) authBean.getRoleList().stream().filter(s -> Objects.equals(s.getName(), RoleTypeEnum.ADMIN.getDesc())).count() : 0;
  109. if (count > 0) {
  110. return true;
  111. }
  112. if (Objects.nonNull(authBean.getSchool())) {
  113. authInfoService.appHasExpired(authBean.getSchool().getCode());
  114. }
  115. //系统公用接口不拦截
  116. Set<String> sysUrls = commonCacheService.privilegeUrlCache(PrivilegePropertyEnum.SYS, SystemConstant.getHeadOrUserSchoolId());
  117. int sysCount = Objects.nonNull(sysUrls) ? (int) sysUrls.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
  118. if (sysCount > 0) {
  119. return true;
  120. }
  121. Set<String> urls = authBean.getUrls();
  122. int privilegeCount = Objects.nonNull(urls) ? (int) urls.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
  123. if (privilegeCount == 0) {
  124. log.warn("Authorization faile: url cannot access");
  125. throw ExceptionResultEnum.UN_AUTHORIZATION.exception();
  126. }
  127. response.setStatus(ExceptionResultEnum.SUCCESS.getCode());
  128. return true;
  129. }
  130. }