Как предварительно авторизовать доступ к Http.InboundGateway?

Я знаю, что можно добавить аннотацию @PreAuthorize к Rest Controller...

@RestController
public class WebController {
    @PreAuthorize("hasAuthority('Foo')")
    @GetMapping("/restricted")
    public ResponseEntity<String> restricted() {
        return ResponseEntity.ok("Restricted section");
    }
}

Как можно предварительно авторизовать доступ к шлюзу Spring Integration Http.inbound? Я знаю, что могу добавить компонент в поток интеграции и добавить аннотацию к методу преобразователя или активатора службы, но я бы не хотел иметь для этого отдельный объект.

@Bean
//@PreAuthorize("hasAuthority('Foo')") ?
public HttpRequestHandlingMessagingGateway restrictedGateway() {
    return Http.inboundGateway("/restricted")
            ...
            .get();
}

@Bean
public IntegrationFlow myFlow(HttpRequestHandlingMessagingGateway restrictedGateway) {
    return IntegrationFlows
            .from(restrictedGateway)
            .transform(source -> "Restricted section")
            .get();
}

comment
Нужен ли мне промежуточный защищенный канал после шлюза в потоке, чтобы добиться этого?   -  person Kevvvvyp    schedule 22.07.2020


Ответы (1)


  • Я думаю, вы правы, взглянув на https://docs.spring.io/spring-integration/reference/html/security.htm, где он позволяет объявить канал @Secured

  • Даже если мы подумаем о весенней безопасности в обычном весеннем загрузочном приложении без интеграции, она находится на уровне фильтра, поэтому кажется, что это имеет смысл, поскольку я рассматриваю HttpRequestHandlingMessagingGateway как прослушиватель HTTP-запросов.

Ты можешь попробовать

    @Bean
    @SecuredChannel(interceptor = "channelSecurityInterceptor", sendAccess = "ROLE_XXX")
    public SubscribableChannel secureChannel() {
        return new DirectChannel();
    }

    @Bean
    public IntegrationFlow myFlow(HttpRequestHandlingMessagingGateway 
                                  restrictedGateway) {
    return IntegrationFlows
            .from(restrictedGateway)
            .channel(secureChannel())
            .transform(source -> "Restricted section")
            .get();
}
person Kavithakaran Kanapathippillai    schedule 22.07.2020
comment
Может ли sendAccess быть hasAuthority? - person Kevvvvyp; 22.07.2020
comment
Извини. У меня нет примера приложения для игры. Но я проверял, что параметр кода sendAccess передается в исходном коде безопасности spring. Он используется как атрибут конфигурации для accessDecisionManager, что то же самое, что используется, когда у вас есть безопасность Spring без интеграции спринта. так я в моем понимании должен работать на hasAuthority - person Kavithakaran Kanapathippillai; 22.07.2020