AuthorizationManager.java 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. Iterator<Object> iterator = resourceRolesMap.keySet().iterator();
  32. List<String> authorities = new ArrayList<>();
  33. while (iterator.hasNext()) {
  34. String pattern = (String) iterator.next();
  35. if (pathMatcher.match(pattern, path)) {
  36. authorities.addAll(Convert.toList(String.class, resourceRolesMap.get(pattern)));
  37. }
  38. }
  39. Mono<AuthorizationDecision> authorizationDecisionMono = mono
  40. .filter(Authentication::isAuthenticated)
  41. .flatMapIterable(Authentication::getAuthorities)
  42. .map(GrantedAuthority::getAuthority)
  43. .any(roleId -> {
  44. log.info("访问路径:{}", path);
  45. log.info("用户角色roleId:{}", roleId);
  46. log.info("资源需要权限authorities:{}", authorities);
  47. return authorities.contains(roleId);
  48. })
  49. .map(AuthorizationDecision::new)
  50. .defaultIfEmpty(new AuthorizationDecision(false));
  51. return authorizationDecisionMono;
  52. }
  53. }