DistributedPrintAuthenticationService.java 6.4 KB

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