springCloud 마이크로서비스 시리즈 - OAuth2+JWT 모드에서의 swagger+feign 처리
                                            
 3541 단어  spring-cloud
                    
해결해야 할 문제:
1、swagger-ui.html 권한 검증 필요 없음
2. swagger는 request 헤더의 Authorization 파라미터의 입력 상자를 제공하여 영패를 입력해야 한다
3. feign을 통해 다른 마이크로서비스를 호출할 때 호출된 서비스는 더 이상 권한 인증이 필요하지 않습니다
1. swagger-ui.html 권한 검증 우회
이 문제는 해결하는 것이 비교적 간단하다. 여기서spring-security를 사용하기 때문에 인증 서버의 보안 설정에서 관련 자원을 돌기만 하면 된다
.antMatchers(
					 Constants.LOGIN_CONTROLLER,
					 Constants.IMAGE_CODE_CONTROLLER+"/**",
					 Constants.SMS_CODE_CONTROLLER+"/**",
					 "/swagger-ui.html",
					 "/swagger-resources/**",
					 "/v2/api-docs",
					 "/oauth/check_token").permitAll()2. swagger는 request 헤더의 Authorization 매개 변수 입력 상자를 제공한다
이 문제도 해결된다. 두 가지 방법은 하나는restapi마다 주석 설명을 하고 하나는javaconfig를 통해 통일적으로 설정하는 것이다.첫 번째 방법은 말할 것이 없다. 여기서 두 번째 방법을 말하면, 아래와 같은 설정만 하면 된다
@Bean
    public Docket createRestApi() {
		ParameterBuilder authorizationPar = new ParameterBuilder();  
        List pars = new ArrayList();    
        authorizationPar.name("Authorization").description("Authorization")  
        .modelRef(new ModelRef("string")).parameterType("header")   
        .required(false).build(); 
        pars.add(authorizationPar.build());    
		
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(MultiRequestHandlerSelectors.basePackage(serverCoreProperties.getSwagger().getBasePackages()))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(pars);
    }  3. 마이크로 서비스 간에feign을 통해 호출될 때 호출된 서비스가 권한 검증을 우회한다
사고방식은 이렇다.feign을 통해 다른 서비스를 호출할 때 차단기를 호출하여 차단기에서 token을request 헤더의Authorization 파라미터에 전송한다.여기 차단기는feign입니다.RequestInterceptor, 구현 코드의 예는 다음과 같습니다.
public class SsoFeignConfig implements RequestInterceptor {
	public static String TOKEN_HEADER = "authorization";
	
	@Override
	public void apply(RequestTemplate template) {
		template.header(TOKEN_HEADER, getHeaders(getHttpServletRequest()).get(TOKEN_HEADER));
	}
	private HttpServletRequest getHttpServletRequest() {
        try {
            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        } catch (Exception e) {
            return null;
        }
    }
	
	private Map getHeaders(HttpServletRequest request) {
        Map map = new LinkedHashMap<>();
        Enumeration enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            String value = request.getHeader(key);
            map.put(key, value);
        }
        return map;
    }
	
}   호출자가 마이크로 서비스를 설명할 때 @FeignClient 주석의 configuration 속성을 통해 차단기를 지정합니다
@FeignClient(name="user-server/userApi", fallback=UserServiceImpl.class, configuration = SsoFeignConfig.class)
public interface UserService {
	@GetMapping("/user/name/{username}")
	public SimpleResponse getByusername(@PathVariable("username") String username);
	
}@FeignClient의name은 마이크로서비스의 서비스 이름 + 마이크로서비스의 contextPath,fallback은 서비스 호출에 실패한 처리 클래스,configuration은 차단기를 지정합니다
지금까지 OAuth2+JWT 모드에서 swagger+feign 처리가 완료되었습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
springboot 기본 예외 처리SpringBoot은 기본적으로 사용자 정의 이상 처리 시스템이 있습니다. SpringBoot 프로젝트를 할 때 실행 중 이상이 발생하면 springBoot은 이상을 처리하고 다음과 같은 이상 정보를 되돌려줍니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.