メインコンテンツにスキップ

Spring Cloud Gateway

The 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を初期化する

この例のコードを直接使用するか、自分のビジネスコードと組み合わせることができます。

ゲートウェイサービスと少なくとも1つのビジネスサービスが必要です。 この例では、casdoor-gatewayがゲートウェイサービスで、casdoor-apiがビジネスサービスです。

ステップ3: 依存関係を含める

Spring Cloud Gatewayプロジェクトにcasdoor-spring-boot-starter依存関係を追加します。

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つのパラメータが必要で、すべて文字列型です。

名前(順番通り)必須説明
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

さらに、Gateway Routingを設定する必要があります。 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つのサービスを提供しています:CasdoorAuthServiceCasdoorUserServiceCasdoorEmailServiceCasdoorSmsServiceCasdoorResourceService

ゲートウェイプロジェクトで次のようにしてそれらを作成できます。

@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の統合についてもっと学ぶために、以下のプロジェクト/ドキュメントを探索することができます。