Spring Cloud Gateway
casdoor-springcloud-gateway-example는 Spring Cloud Gateway에서 casdoor-spring-boot-starter를 OAuth2 플러그인으로 사용하는 방법의 예입니다. 그것을 사용하는 방법은 아래에 설명되어 있습니다.
단계 1: Casdoor 배포
먼저, Casdoor를 배포해야 합니다. 서버 설치에 대한 공식 Casdoor 문서를 참조할 수 있습니다. 프로덕션 모드에서 Casdoor 인스턴스를 배포하십시오.
성공적인 배포 후에는 다음을 확인해야 합니다:
- 선호하는 브라우저를 열고 http://localhost:8000을 방문하십시오. Casdoor의 로그인 페이지를 볼 수 있습니다.
admin
과123
을 입력하여 로그인 기능이 제대로 작동하는지 테스트하십시오.
그 후, 다음 단계를 사용하여 자신의 앱에서 Casdoor 기반 로그인 페이지를 빠르게 구현할 수 있습니다.
단계 2: Spring Cloud Gateway 초기화
이 예제의 코드를 직접 사용하거나 자신의 비즈니스 코드와 결합할 수 있습니다.
게이트웨이 서비스와 최소한 하나의 비즈니스 서비스가 필요합니다. 이 예제에서, casdoor-gateway
는 게이트웨이 서비스이고 casdoor-api
는 비즈니스 서비스입니다.
단계 3: 의존성 포함
casdoor-spring-boot-starter
의존성을 Spring Cloud Gateway 프로젝트에 추가하세요.
Apache Maven을 위해:
<!-- 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개의 매개변수가 필요합니다.
이름 (순서대로) | 필수 | 설명 |
---|---|---|
endpoint | 예 | Casdoor 서버 URL, 예를 들어 http://localhost:8000 |
clientId | 예 | Application.client_id |
clientSecret | 예 | Application.client_secret |
certificate | 예 | Application.certificate |
organizationName | 예 | Application.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
에서 리소스를 요청하는 버튼을 클릭하세요.
게이트웨이 인증 로직이 트리거됩니다. 로그인하지 않았으므로 로그인 인터페이스로 리디렉션됩니다. 로그인 버튼을 클릭하세요.
Casdoor의 통합 로그인 플랫폼을 볼 수 있습니다.
로그인에 성공하면 메인 인터페이스로 리디렉션됩니다. 이제 어떤 버튼이든 클릭할 수 있습니다.
더불어
Java와 Casdoor의 통합에 대해 더 알아보려면 다음 프로젝트/문서를 참조하십시오.