AuthorizationManager.java 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package com.inspur.smsb.gateway.config;
  2. import cn.hutool.core.convert.Convert;
  3. import lombok.AllArgsConstructor;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.http.server.reactive.ServerHttpRequest;
  6. import org.springframework.security.authorization.AuthorizationDecision;
  7. import org.springframework.security.authorization.ReactiveAuthorizationManager;
  8. import org.springframework.security.core.Authentication;
  9. import org.springframework.security.core.GrantedAuthority;
  10. import org.springframework.security.web.server.authorization.AuthorizationContext;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.util.AntPathMatcher;
  13. import org.springframework.util.PathMatcher;
  14. import reactor.core.publisher.Mono;
  15. import java.util.*;
  16. /**
  17. * 鉴权管理器
  18. */
  19. @Component
  20. @AllArgsConstructor
  21. @Slf4j
  22. public class AuthorizationManager implements ReactiveAuthorizationManager<AuthorizationContext> {
  23. @Override
  24. public Mono<AuthorizationDecision> check(Mono<Authentication> mono, AuthorizationContext authorizationContext) {
  25. ServerHttpRequest request = authorizationContext.getExchange().getRequest();
  26. String path = request.getURI().getPath();
  27. PathMatcher pathMatcher = new AntPathMatcher();
  28. // todo 资源权限角色关系列表,需要初始化到容器中
  29. Map<Object, Object> resourceRolesMap = new HashMap<>();
  30. resourceRolesMap.put("/token/**","force");
  31. resourceRolesMap.put("/**/orchestration/calendarRelease/**","delete-force");
  32. Iterator<Object> iterator = resourceRolesMap.keySet().iterator();
  33. List<String> authorities = new ArrayList<>();
  34. while (iterator.hasNext()) {
  35. String pattern = (String) iterator.next();
  36. if (pathMatcher.match(pattern, path)) {
  37. authorities.addAll(Convert.toList(String.class, resourceRolesMap.get(pattern)));
  38. }
  39. }
  40. Mono<AuthorizationDecision> authorizationDecisionMono = mono
  41. .filter(Authentication::isAuthenticated)
  42. .flatMapIterable(Authentication::getAuthorities)
  43. .map(GrantedAuthority::getAuthority)
  44. .any(roleId -> {
  45. return authorities.contains(roleId);
  46. })
  47. .map(AuthorizationDecision::new)
  48. .defaultIfEmpty(new AuthorizationDecision(false));
  49. return authorizationDecisionMono;
  50. }
  51. }