DistributedPrintAuthenticationService.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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.contant.SystemConstant;
  8. import com.qmth.teachcloud.common.entity.SysUser;
  9. import com.qmth.teachcloud.common.entity.TBSession;
  10. import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
  11. import com.qmth.teachcloud.common.enums.PrivilegePropertyEnum;
  12. import com.qmth.teachcloud.common.enums.RoleTypeEnum;
  13. import com.qmth.teachcloud.common.service.CacheService;
  14. import com.qmth.teachcloud.common.service.TBSessionService;
  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. CacheService cacheService;
  31. @Resource
  32. RedisUtil redisUtil;
  33. @Override
  34. public AccessEntity findByIdentity(String identity, SignatureType signatureType, String path) {
  35. return new DistributedPrintSession(identity, SignatureType.TOKEN);
  36. }
  37. @Override
  38. public boolean hasPermission(AccessEntity accessEntity, String path) {
  39. if (Objects.nonNull(accessEntity) && Objects.nonNull(accessEntity.getIdentity())) {
  40. TBSession tbSession = (TBSession) redisUtil.getUserSession(accessEntity.getIdentity());
  41. if (Objects.isNull(tbSession)) {
  42. log.warn("Authorization faile: session id not exists: " + accessEntity.getIdentity());
  43. throw ExceptionResultEnum.NOT_LOGIN.exception();
  44. }
  45. if (tbSession.getExpireTime() <= System.currentTimeMillis()) {
  46. log.warn("Authorization faile: session has expired, expire time=" + tbSession.getExpireTime());
  47. throw ExceptionResultEnum.NOT_LOGIN.exception();
  48. }
  49. Platform platform = ServletUtil.getRequestPlatform();
  50. String deviceId = ServletUtil.getRequestDeviceId();
  51. if (!tbSession.getPlatform().equalsIgnoreCase(platform.name())) {
  52. log.warn("Authorization faile: platform invalid, session platform is " + tbSession.getPlatform());
  53. throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
  54. }
  55. if (!tbSession.getDeviceId().equalsIgnoreCase(deviceId)) {
  56. log.warn("Authorization faile: deviceId invalid, session deviceId is " + tbSession.getDeviceId());
  57. throw ExceptionResultEnum.AUTHORIZATION_ERROR.exception();
  58. }
  59. List<String> privilegeUrl = cacheService.privilegeUrlCache(PrivilegePropertyEnum.NO_AUTH);
  60. //无需鉴权的url
  61. int noAuthCount = Objects.nonNull(privilegeUrl) ? (int) privilegeUrl.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
  62. if (noAuthCount > 0) {
  63. return true;
  64. }
  65. Long userId = Long.parseLong(tbSession.getIdentity());
  66. SysUser sysUser = cacheService.userCache(userId);
  67. HttpServletRequest request = ServletUtil.getRequest();
  68. HttpServletResponse response = ServletUtil.getResponse();
  69. request.setAttribute(SystemConstant.SESSION, tbSession);
  70. request.setAttribute(SystemConstant.USER, sysUser);
  71. return authFootCommon(userId, SystemConstant.USER_OAUTH_CACHE, path, request, response);
  72. }
  73. return false;
  74. }
  75. /**
  76. * 鉴权尾公用
  77. *
  78. * @param userId
  79. * @param type
  80. * @param path
  81. * @param request
  82. * @param response
  83. * @return
  84. */
  85. public boolean authFootCommon(Long userId,
  86. String type,
  87. String path,
  88. HttpServletRequest request,
  89. HttpServletResponse response) {
  90. //验证权限
  91. AuthBean authBean = type.contains(SystemConstant.USER_OAUTH_CACHE) ? authBean = cacheService.userAuthCache(userId) : null;
  92. if (Objects.isNull(authBean)) {
  93. throw ExceptionResultEnum.ROLE_ENABLE_AUTHORIZATION.exception();
  94. }
  95. request.setAttribute(SystemConstant.SCHOOL, authBean.getSchool());
  96. request.setAttribute(SystemConstant.ORG, authBean.getOrg());
  97. //超级系统管理员拥有所有权限
  98. int count = Objects.nonNull(authBean) ? (int) authBean.getRoleList().stream().filter(s -> s.getType() == RoleTypeEnum.ADMIN).count() : 0;
  99. if (count > 0) {
  100. return true;
  101. }
  102. //系统公用接口不拦截
  103. List<String> sysUrls = cacheService.privilegeUrlCache(PrivilegePropertyEnum.SYS);
  104. int sysCount = Objects.nonNull(sysUrls) ? (int) sysUrls.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
  105. if (sysCount > 0) {
  106. return true;
  107. }
  108. Set<String> urls = authBean.getUrls();
  109. int privilegeCount = Objects.nonNull(urls) ? (int) urls.stream().filter(s -> s.equalsIgnoreCase(path)).count() : 0;
  110. if (privilegeCount == 0) {
  111. log.warn("Authorization faile: url cannot access");
  112. throw ExceptionResultEnum.UN_AUTHORIZATION.exception();
  113. }
  114. response.setStatus(ExceptionResultEnum.SUCCESS.getCode());
  115. return true;
  116. }
  117. }