使用JWT

时间:2018-01-24 14:25:53

标签: java spring spring-security oauth-2.0 jwt

我目前正在使用SpringBoot 2.0.0.M7和spring-boot-starter-webflux开发应用程序。它还使用Spring Boot WebFlux Functional Rest API和Spring Boot Actuator。

应用程序本身非常简单,并且按预期工作。我可以将book(/ api / v1 / book)发布到ArrayList并从ArrayList获取所有书籍(/ api / v1 / book)。 Rest API文档可在(/)URL上获得,Actuator端点可在(/执行器)URL上获得。

问题是如何使用OAuth2和JWT保护我的WebFlux Functional Rest API?我可以在JWT中找到很多OAuth2示例,但它们适用于较旧的Spring Boot。下面是一个示例https://dzone.com/articles/spring-oauth2-with-jwt-sample SpringBoot 2.0.0.M7支持OAuth2登录,但此示例https://spring.io/blog/2017/09/15/spring-security-5-0-0-m4-released未说明如何在Rest API中使用OAuth2和JWT。我甚至没有找到该示例的完整源代码。此视频https://www.youtube.com/watch?v=LzNhedHo7pM和此示例https://medium.com/@mohitsinha.it/spring-boot-reactive-tutorial-ffab309b2dcd仅使用基本身份验证。

有谁知道如何使用@EnableWebFluxSecurity注释和OAuth2与JWT保护我的(/ api / v1 / book)端点?

以下是 RoutingConfiguration 类的示例。

@Configuration
@EnableWebFlux
public class RoutingConfiguration implements WebFluxConfigurer {

    private final static String API_URL = "api";
    private final MeterRegistry registry;

    public RoutingConfiguration(MeterRegistry registry) {
        this.registry = registry;
    }

    @Override
    public void addCorsMappings(CorsRegistry corsRegistry) {
        corsRegistry.addMapping(API_URL + "/**").allowedMethods("GET", "POST");
    }

    @Bean
    public RouterFunction<?> indexRouter(final IndexHandler indexHandler, final ErrorHandler errorHandler) {
        RouterFunctionMetrics metrics = new RouterFunctionMetrics(this.registry);
        return route(GET("/"), indexHandler::getRestApiDocs).filter(metrics.timer("http.request.index.page"));      
    }

    @Bean
    public RouterFunction<?> bookRouter(final BookHandler handler, final ErrorHandler errorHandler) {
        return 
                nest(path(API_URL + "/v1/book"), 
                    nest(accept(MediaType.APPLICATION_JSON), 
                        route(GET("/"), handler::getAllBooks)
                        .andRoute(POST("/"), handler::saveBook)
                    ).andOther(route(RequestPredicates.all(), errorHandler::notFound))
                );
    }
}

0 个答案:

没有答案