当前位置: 首页 > 知识库问答 >
问题:

SpringCloudGatewayYML路由-有没有检查权限的方法?

倪鸿禧
2023-03-14

我有一些微服务和使用Spring Cloud的网关。我正试图在网关中设置路由。理想情况下,我想在YML文件中设置路由,或者使用RouteLocator bean。

但目前,在我的网关中,每个路由都有RESTendpoint,这只是使用WebClient向前发送请求。

(在此之前,我有一个ReactiveAuthenticationManager过滤器,用于验证JWT令牌。它返回一个UsernamePasswordAuthenticationToken,其中包括它从令牌获得的一些用户权限)。

下面是一个html" target="_blank">示例,其中我设置了一个到称为跟踪服务的微服务的路由:

控制器:

@RestController
@RequestMapping("/tracking-service/tracking")
public class TrackingController {

  @Autowired
  private TrackingService trackingService;

  @GetMapping
  public Flux getAllTracking() {
    return trackingService.getAllTracking();
  }

}

服务:

@Service
public class TrackingService {

  private WebClient webClient;

  @PreAuthorize("hasAuthority('MANAGER')")
  public Flux getAllTracking() {
    //Make HTTP call to the tracking service
  }

}

我这样做的原因是@PreAuthorize注释。如果客户端的JWT令牌不包括“MANAGER”令牌,则将返回403禁止状态。并非所有endpoint都需要管理者权限,有些endpoint需要其他权限。

我的问题-在使用YML进行路由时是否可以这样做?我希望看到像这样的东西,但我不确定这是否可能?我已经阅读了Spring文档并查看了所有可用的过滤器,但是我看不到任何可以完成这项工作的东西。

spring:
  cloud:
    gateway:
      routes:
        - id: tracking
          uri: http://tracking-service
          predicates:
            - Path=/tracking-service/**
          filters:
            - StripPrefix=1
            - PreAuthorize=hasAuthority('MANAGER')

谢谢。

共有1个答案

谭鹏云
2023-03-14

API网关和授权是两个独立的关注点。理想情况下,网关应用程序中不应混合使用授权。为了获得许可,您可以直接将其映射到这样的服务。

@RestController
public class ResourceREST {

    @RequestMapping(value = "/resource/", method = RequestMethod.GET)
     @PreAuthorize("@customPermissionEvaluator.hasPrivilege(authentication,'somepermission')")
    public Mono<ResponseEntity<?>> user() {
        return Mono.just(ResponseEntity.ok(new Message("Access allowed")));
    }
}

并定义自定义权限计算器

@Service
public class CustomPermissionEvaluator {

    public boolean hasPrivilege(Authentication auth, String permission) {
        String requiredPermissionCheck = permission.toLowerCase();
        for (GrantedAuthority grantedAuth : auth.getAuthorities()) {
            if (grantedAuth.getAuthority().contains(requiredPermissionCheck)) {
                return true;
            }
        }
        return false;
    }
}

因此,网关在路由中不提供任何理想的授权。

 类似资料:
  • 有没有vue3+ts控制路由权限的项目案例?

  • 我在Windows7上安装了WAMP2.1。然而,当我打开phpMyAdmin时,我得到一个错误,Mysql'No provideges'。我卸载了wamp并重新安装了几次,但都没有用。有人知道如何解决这个问题吗? 此外,当我试图从mysql控制台创建一个数据库,我得到以下错误:错误1044

  • 此代码用于测试应用程序是否具有权限,如果您具有权限,则返回true,否则返回false。 错误: PID:25504 java.lang.NullPointerException:试图在Android.Content.Context Android.Content.Content.Context.GetApplicationContext(view.java:21147)在Android.os.h

  • 我在Google BigQuery中创建了一个数据集,并下载了json auth文件。我试图从Jupyter笔记本中的python访问此数据集中的表,但我得到了错误: “禁止:403补丁https://bigquery.googleapis.com/bigquery/v2/projects/testdbt-bigquery-20200403/datasets/landing_zone_flight

  • 问题内容: 我正在学习AngularJS,有一件事让我很烦。 我用来为我的应用程序声明路由规则: 但是当我在浏览器中导航到我的应用程序时,我看到的不是。 所以我的问题是为什么AngularJS将此hash添加到url中?有可能避免它吗? 问题答案: 实际上,对于非HTML5浏览器,您需要#(#标签)。 否则,他们将只通过提到的href对服务器进行HTTP调用。#是一个旧的浏览器短路问题,它不会触发

  • 问题内容: 我正在学习AngularJS,有一件事让我很烦。 我用来为我的应用程序声明路由规则: 但是当我在浏览器中导航到我的应用程序时,我看到的不是。 所以我的问题是为什么AngularJS将此哈希添加到url中?有可能避免它吗? 问题答案: 实际上,对于非HTML5浏览器,您需要#(#标签)。 否则,他们将只通过提到的href对服务器进行HTTP调用。#是一个旧的浏览器短路问题,它不会触发请求