메인 콘텐츠로 건너뛰기

Spring Cloud Gateway

casdoor-springcloud-gateway-example는 Spring Cloud Gateway에서 casdoor-spring-boot-starter를 OAuth2 플러그인으로 사용하는 방법의 예입니다. 그것을 사용하는 방법은 아래에 설명되어 있습니다.

단계 1: Casdoor 배포

먼저, Casdoor를 배포해야 합니다. 서버 설치에 대한 공식 Casdoor 문서를 참조할 수 있습니다. 프로덕션 모드에서 Casdoor 인스턴스를 배포하십시오.

성공적인 배포 후에는 다음을 확인해야 합니다:

  • 선호하는 브라우저를 열고 http://localhost:8000을 방문하십시오. Casdoor의 로그인 페이지를 볼 수 있습니다.
  • admin123을 입력하여 로그인 기능이 제대로 작동하는지 테스트하십시오.

그 후, 다음 단계를 사용하여 자신의 앱에서 Casdoor 기반 로그인 페이지를 빠르게 구현할 수 있습니다.

단계 2: Spring Cloud Gateway 초기화

이 예제의 코드를 직접 사용하거나 자신의 비즈니스 코드와 결합할 수 있습니다.

게이트웨이 서비스와 최소한 하나의 비즈니스 서비스가 필요합니다. 이 예제에서, casdoor-gateway는 게이트웨이 서비스이고 casdoor-api는 비즈니스 서비스입니다.

단계 3: 의존성 포함

casdoor-spring-boot-starter 의존성을 Spring Cloud Gateway 프로젝트에 추가하세요.

Apache Maven을 위해:

/casdoor-gateway/pom.xml
<!-- https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter -->
<dependency>
<groupId>org.casbin</groupId>
<artifactId>casdoor-spring-boot-starter</artifactId>
<version>1.x.y</version>
</dependency>

Gradle을 위해:

// https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter
implementation group: 'org.casbin', name: 'casdoor-spring-boot-starter', version: '1.x.y'

단계 4: 속성 설정

초기화에는 문자열 타입의 6개의 매개변수가 필요합니다.

이름 (순서대로)필수설명
endpointCasdoor 서버 URL, 예를 들어 http://localhost:8000
clientIdApplication.client_id
clientSecretApplication.client_secret
certificateApplication.certificate
organizationNameApplication.organization
applicationName아니오Application.name

이 매개변수들을 초기화하기 위해 Java 속성이나 YAML 파일을 사용할 수 있습니다.

속성을 위해:

casdoor.endpoint=http://localhost:8000
casdoor.clientId=<client-id>
casdoor.clientSecret=<client-secret>
casdoor.certificate=<certificate>
casdoor.organizationName=built-in
casdoor.applicationName=app-built-in

YAML을 위해:

casdoor:
endpoint: http://localhost:8000
client-id: <client-id>
client-secret: <client-secret>
certificate: <certificate>
organization-name: built-in
application-name: app-built-in

또한, 게이트웨이 라우팅을 설정해야 합니다. YAML을 위해:

spring:
application:
name: casdoor-gateway
cloud:
gateway:
routes:
- id: api-route
uri: http://localhost:9091
predicates:
- Path=/api/**

단계 5: CasdoorAuthFilter 추가

이 예제에서 사용된 CasdoorAuthFilter와 같은 GlobalFilter 인터페이스의 구현 클래스를 게이트웨이에 추가하여 신원을 검증하세요.

인증이 실패하면 프론트엔드에 401 상태 코드를 반환하여 로그인 인터페이스로 리디렉션합니다.

@Component
public class CasdoorAuthFilter implements GlobalFilter, Ordered {

private static final Logger LOGGER = LoggerFactory.getLogger(CasdoorAuthFilter.class);

@Override public int getOrder() {
return 0;
}

@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return exchange.getSession().flatMap(webSession -> {
CasdoorUser user = webSession.getAttribute("casdoorUser");
if (user != null) {
return chain.filter(exchange);
}
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json");
return response.setComplete();
});
}
}

단계 6: 서비스 가져오기 및 사용

현재 5개의 서비스를 제공합니다: CasdoorAuthService, CasdoorUserService, CasdoorEmailService, CasdoorSmsService, 그리고 CasdoorResourceService.

게이트웨이 프로젝트에서 다음과 같이 생성할 수 있습니다.

@Resource
private CasdoorAuthService casdoorAuthService;

앱에 대한 접근을 인증해야 할 때, 대상 URL을 보내고 Casdoor에서 제공하는 로그인 페이지로 리디렉션할 수 있습니다.

미리 애플리케이션 구성에 콜백 URL (예, http://localhost:9090/callback)을 추가했는지 확인하세요.

@RequestMapping("login")
public Mono<String> login() {
return Mono.just("redirect:" + casdoorAuthService.getSigninUrl("http://localhost:9090/callback"));
}

Casdoor에 의해 성공적으로 검증된 후, 코드와 상태가 포함된 애플리케이션으로 다시 리디렉션됩니다. 코드를 얻고 getOAuthToken 메소드를 호출하여 JWT 토큰을 파싱할 수 있습니다.

CasdoorUser는 Casdoor에서 제공하는 사용자에 대한 기본 정보를 포함합니다. 이를 키워드로 사용하여 애플리케이션에서 세션을 설정할 수 있습니다.

@RequestMapping("callback")
public Mono<String> callback(String code, String state, ServerWebExchange exchange) {
String token = "";
CasdoorUser user = null;
try {
token = casdoorAuthService.getOAuthToken(code, state);
user = casdoorAuthService.parseJwtToken(token);
} catch(CasdoorAuthException e) {
e.printStackTrace();
}
CasdoorUser finalUser = user;
return exchange.getSession().flatMap(session -> {
session.getAttributes().put("casdoorUser", finalUser);
return Mono.just("redirect:/");
});
}

아래에 API 예시가 나와 있습니다.

  • CasdoorAuthService
    • String token = casdoorAuthService.getOAuthToken(code, "app-built-in");
    • CasdoorUser casdoorUser = casdoorAuthService.parseJwtToken(token);
  • CasdoorUserService
    • CasdoorUser casdoorUser = casdoorUserService.getUser("admin");
    • CasdoorUser casdoorUser = casdoorUserService.getUserByEmail("admin@example.com");
    • CasdoorUser[] casdoorUsers = casdoorUserService.getUsers();
    • CasdoorUser[] casdoorUsers = casdoorUserService.getSortedUsers("created_time", 5);
    • int count = casdoorUserService.getUserCount("0");
    • CasdoorResponse response = casdoorUserService.addUser(user);
    • CasdoorResponse response = casdoorUserService.updateUser(user);
    • CasdoorResponse response = casdoorUserService.deleteUser(user);
  • CasdoorEmailService
    • CasdoorResponse response = casdoorEmailService.sendEmail(title, content, sender, receiver);
  • CasdoorSmsService
    • CasdoorResponse response = casdoorSmsService.sendSms(randomCode(), receiver);
  • CasdoorResourceService
    • CasdoorResponse response = casdoorResourceService.uploadResource(user, tag, parent, fullFilePath, file);
    • CasdoorResponse response = casdoorResourceService.deleteResource(file.getName());

단계 7: 프로젝트 재시작

프로젝트를 시작한 후, 가장 좋아하는 브라우저를 열고 http://localhost:9090을 방문하세요. 그런 다음 casdoor-api에서 리소스를 요청하는 버튼을 클릭하세요.

인덱스

게이트웨이 인증 로직이 트리거됩니다. 로그인하지 않았으므로 로그인 인터페이스로 리디렉션됩니다. 로그인 버튼을 클릭하세요.

toLogin

Casdoor의 통합 로그인 플랫폼을 볼 수 있습니다.

로그인

로그인에 성공하면 메인 인터페이스로 리디렉션됩니다. 이제 어떤 버튼이든 클릭할 수 있습니다.

index-ok

더불어

Java와 Casdoor의 통합에 대해 더 알아보려면 다음 프로젝트/문서를 참조하십시오.