简体   繁体   English

微服务在springboot中如何使用jwt进行通信

[英]how microservice use jwt to communicate in springboot

I am using microservice in spring boot and i want to use jwt and oauth2 to access the server.But i just wonder that how microservice other than api gateway get the data in the jwt (id or name).It seems that it is so tedious to set a decoder in every microservice.我在 spring 引导中使用微服务,我想使用 jwt 和 oauth2 访问服务器。但我只是想知道除 api 网关之外的微服务如何获取 jwt(id 或名称)中的数据。这似乎很乏味在每个微服务中设置解码器。

I am thinking that is it possible to decode and add the data at the httprequest and route it the other microservice in apigateway.But it seems that i cant find a setheader method in webflux filter security.我在想是否可以在 httprequest 解码和添加数据并将其路由到 apigateway 中的其他微服务。但似乎我无法在 webflux 过滤器安全性中找到 setheader 方法。

Jwt filter: Jwt过滤器:

 @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        String authorizationheader= exchange.getRequest().getHeaders().get("Authorization").toString();
        String token;
        String Username = null;
        String iss=null;
        //check have tokem
        if(authorizationheader !=null&& authorizationheader.startsWith("Bearer ")){
            token=authorizationheader.substring(7);
            Username=jwtDecoder.decode(token).getSubject();
            iss= String.valueOf(jwtDecoder.decode(token).getIssuer());


        } //verify by check username and iss
        if(Username!=null && iss!=null&& SecurityContextHolder.getContext().getAuthentication()==null){
            if(iss.equals("http://localhost:8080")){
                UserDetails userDetails=new User(Username,null,null);
                UsernamePasswordAuthenticationToken AuthenticationToken=new UsernamePasswordAuthenticationToken(
                        userDetails,null,userDetails.getAuthorities());
                //set username and id to the request

                SecurityContextHolder.getContext().setAuthentication(AuthenticationToken);
            }
        }
        return chain.filter(exchange);

    }

Securityfilter bean:安全过滤器 bean:

@Bean
    public SecurityWebFilterChain filterChain(ServerHttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                /*.csrf(csrf -> csrf.ignoringRequestMatchers("/Job/getRegionjobs/**",
                        "/Job/getalljobs","/login/oauth2/code/google"))*/
                .csrf(csrf -> csrf.disable())

                .authorizeExchange(auth->auth.anyExchange().authenticated())
                .addFilterBefore(jwtFilter, SecurityWebFiltersOrder.AUTHENTICATION)
                .oauth2ResourceServer(ServerHttpSecurity.OAuth2ResourceServerSpec::jwt)
                //.sessionManagement(session-> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .httpBasic(withDefaults())
                .build();



    }

Please help请帮忙

It seems that it is so tedious to set a decoder in every microservice.在每个微服务中设置一个解码器似乎很繁琐。

No, it is not.不它不是。 Configuring a resource-server (OAuth2 REST API) can be as simple as:配置资源服务器(OAuth2 REST API)可以很简单:

<dependency>
    <groupId>com.c4-soft.springaddons</groupId>
    <!-- replace "webmvc" with "weblux" if your micro-service is reactive -->
    <artifactId>spring-addons-webmvc-jwt-resource-server</artifactId>
    <version>6.0.12</version>
</dependency>
@Configuration
@EnableMethodSecurity
public static class WebSecurityConfig { }
com.c4-soft.springaddons.security.issuers[0].location=https://localhost:8443/realms/realm1
com.c4-soft.springaddons.security.issuers[0].authorities.claims=realm_access.roles,ressource_access.some-client.roles,ressource_access.other-client.roles


com.c4-soft.springaddons.security.cors[0].path=/some-api

If you don't want to use my starters , you can still create your own copying from it (it is open source and each is composed of 3 files only).如果您不想使用我的启动器,您仍然可以从中创建自己的副本(它是开源的,每个仅由 3 个文件组成)。

If you don't implement access-control in each micro-service, then you can't bypass the gateway and it's going to be a hell to implement rules involving the resources itself (like only user who created that kind of resource can modify it).如果你不在每个微服务中实现访问控制,那么你就无法绕过网关,并且实现涉及资源本身的规则将是一个地狱(比如只有创建这种资源的用户才能修改它).

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM