Spring SecurityのCAS SSO

1概要

この記事では、Central Authentication Service(CAS)とSpring Securityとの統合について説明します。 CASはシングルサインオン(SSO)サービスです。

ユーザー認証を必要とするアプリケーションがあるとしましょう。最も一般的な方法は、アプリケーションごとにセキュリティメカニズムを実装することです。

ただし、すべてのアプリに対してユーザー認証を1か所で実装するほうが良いでしょう。

これがまさにCAS SSOシステムの機能です。このhttps://apereo.github.io/cas/5.1.x/planning/Architecture.html[article]に、アーキテクチャーの詳細が記載されています。プロトコル図はhttps://apereo.github.io/cas/5.1.x/protocol/CAS-Protocol.html[ここ]にあります。

** 2プロジェクトの設定とインストール

中央認証サービスの設定には、少なくとも2つのコンポーネントが関係します。 1つのコンポーネントは cas-server と呼ばれるSpringベースのサーバーです。他のコンポーネントは1つ以上のクライアントで構成されています。

クライアントは、認証にサーバーを使用しているWebアプリケーションならどれでもかまいません。

2.1. CASサーバーの設定

サーバーは、簡単なセットアップと展開を容易にするためにMaven(Gradle)War Overlayスタイルを使用します。複製して使用できるクイックスタートテンプレートがあります。

クローンしましょう。

git clone https://github.com/apereo/cas-overlay-template.git cas-server

このコマンドは cas-overlay-template をローカルマシンの cas-server ディレクトリに複製します。

次に、ルート pom.xml に追加の依存関係を追加しましょう。これらの依存関係により、JSON構成を介したサービス登録が可能になります。

また、データベースへの接続を容易にします。

<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-json-service-registry</artifactId>
    <version>${cas.version}</version>
</dependency>
<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-jdbc</artifactId>
    <version>${cas.version}</version>
</dependency>
<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-jdbc-drivers</artifactId>
    <version>${cas.version}</version>
</dependency>

最新版https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apereo.cas%22%20a%3A%22cas-server-support-json-service-registry %22[cas-server-support-json-service-registry]、https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apereo.cas%22%20a%3A %22cas-server-support-jdbc%22[cas-server-support-jdbc]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apereo.cas%22 %20a%3A%22cas-server-support-jdbc-drivers%22[cas-server-support-jdbc-drivers]依存関係は、Maven Centralにあります。親の pom.xml がアーティファクトバージョンを自動的に管理することに注意してください。

次に、フォルダ cas-server/src/main/resources を作成し、フォルダ cas-server/etc をコピーしましょう。それに。また、アプリケーションのポートとSSLキーストアのパスも変更します。

cas-server/src/main/resources/application.properties にある関連エントリを編集してこれらを設定します。

server.port=6443
server.ssl.key-store=classpath:/etc/cas/thekeystore
standalone.config=classpath:/etc/cas/config

configフォルダのパスも classpath:/etc/cas/config に設定されています。それは cas-server/src/main/resources/etc/cas/config を指します。

次のステップは、ローカルSSLキーストアを生成することです。キーストアはHTTPS接続を確立するために使用されます。この手順は重要であり、省略することはできません。

端末から、ディレクトリを cas-server/src/main/resources/etc/cas に変更します。その後、次のコマンドを実行してください。

keytool -genkey -keyalg RSA -alias thekeystore -keystore thekeystore
-storepass changeit -validity 360 -keysize 2048
  • 名、姓、組織名、さらには組織単位の入力を求められたら、 localhost を使用することが重要です。これを怠ると、SSLハンドシェイク中にエラーが発生する可能性があります。市、州、国などの他のフィールドも適切に設定できます。

上記のコマンドは、 thekeystore およびpassword __changeitという名前のキーストアを生成します。これは現在のディレクトリに格納されています。

次に、生成されたキーストアをクライアントアプリケーションで使用するために .crt 形式にエクスポートする必要があります。そのため、同じディレクトリ内で、次のコマンドを実行して、生成された thekeystore ファイルを__thekeystore.crtにエクスポートします。

keytool -export -alias thekeystore -file thekeystore.crt
-keystore thekeystore

それでは、エクスポートした thekeystore.crt をJavaの cacerts キーストアにインポートしましょう。端末プロンプトは依然として cas-server/src/main/resources/etc/cas ディレクトリにあるはずです。

そこから、コマンドを実行します。

keytool -import -alias thekeystore -storepass changeit -file thekeystore.crt
 -keystore "C:\Program Files\Java\jdk1.8.0__152\jre\lib\security\cacerts"

念のために、JDKインストールの外部にあるJREに証明書をインポートすることもできます。

keytool -import -alias thekeystore -storepass changeit -file thekeystore.crt
-keystore "C:\Program Files\Java\jre1.8.0__152\lib\security\cacerts"

-keystore フラグは、ローカルマシン上のJavaキーストアの場所を指すことに注意してください。この場所は、現在インストールされているJavaによって異なります。

さらに、** キーストアの場所として参照されるJREが、クライアントアプリケーションに使用されているものと同じであることを確認してください。

thekeystore.crt をJavaキーストアに正常に追加したら、システムを再起動する必要があります。同様に、ローカルマシンで実行されているJVMのすべてのインスタンスを強制終了できます。

次に、ルートプロジェクトディレクトリ cas-serverから、端末から build package および build run__コマンドを呼び出します。サーバーの起動にはしばらく時間がかかります。準備が整うと、コンソールにREADYと表示されます。

この時点で、ブラウザで https://localhost:6443/cas にアクセスすると、ログインフォームが表示されます。デフォルトのユーザー名は casuser 、パスワードは Mellon です。

2.2. CASクライアントの設定

Spring Initializr を使用して、Web、Security、Freemarker、およびオプションでDevToolsの依存関係を持つプロジェクトを生成します。

Spring Initializrによって生成された依存関係に加えて、Spring Security CASモジュールの依存関係を追加しましょう。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-cas</artifactId>
</dependency>

依存関係の最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.security%22%20a%3A%22spring-security-casにあります。 %22[メイヴン中央]。 application.properties : に次のエントリを追加して、サーバーのポートがポート9000をリッスンするようにも設定しましょう。

server.port=9000

3 CASサーバーへのサービス/クライアントの登録

サーバーは、認証のために他のクライアントからのアクセスを許可しません。 クライアント/サービスはCASサーバーサービスレジストリ に登録されている必要があります。

サーバーにサービスを登録する方法はいくつかあります。

これらには、YAML、JSON、Mongo、LDAP、およびhttps://apereo.github.io/cas/5.1.x/installation/Service-Management.html[その他]が含まれます。

メソッドによっては、 pom.xml ファイルに含まれる依存関係があります。この記事では、JSON Service Registryメソッドを使用します。依存関係は、前のセクションの pom.xml ファイルにすでに含まれていました。

クライアントアプリケーションの定義を含むJSONファイルを作成しましょう。 cas-server/src/main/resources フォルダーの中に、さらに別のフォルダー servicesを作成しましょう。これはJSONファイルを含むこの services__フォルダーです。

次に、 cas-server/src/main/resources/services ディレクトリに casSecuredApp-19991.json という名前のJSONファイルを次の内容で作成します。

{
    "@class" : "org.apereo.cas.services.RegexRegisteredService",
    "serviceId" : "^http://localhost:9000/login/cas",
    "name" : "CAS Spring Secured App",
    "description": "This is a Spring App that usses the CAS Server for it's authentication",
    "id" : 19991,
    "evaluationOrder" : 1
}

serviceId 属性は、認証にサーバーを使用する予定のクライアントアプリケーションの正規表現URLパターンを定義します。この場合、パターンはlocalhostで実行され、ポート9000でlistenしているアプリケーションと一致します。

競合を避け、誤って設定を上書きしないように、 id 属性は一意である必要があります。サービス構成ファイルの名前は、 service name-id.json の規則に従います。 theme proxyPolicy logo privacyUrl__などのその他の設定可能な属性は、https://apereo.github.io/cas/5.1.x/installation/Service-Management.html[ここ]にあります。

ここでは、JSONサービスレジストリを有効にするための設定項目をさらに2つ追加しましょう。 1つは、サービス構成ファイルが配置されているディレクトリにあるサーバーに通知することです。もう1つは、JSON構成ファイルからサービスレジストリの初期化を有効にすることです。

これらの設定項目は両方とも cas.properties. という名前の別のファイルに配置されます。このファイルは cas-server / src/main/resources ディレクトリに作成します。

cas.serviceRegistry.initFromJson=true
cas.serviceRegistry.config.location=classpath:/services

build run コマンドをもう一度実行して、コンソールの から Loaded[3]service(s)]などの行を書き留めます。

4 Springのセキュリティ設定

4.1. シングルサインオン の設定

これでSpring Boot ApplicationがサービスとしてCASサーバーに登録されました。ユーザー認証のためにSpring Securityがサーバーと連携して動作するように設定しましょう。 Spring Securityとサーバ間のやり取りの完全な順序はhttps://docs.spring.io/spring-security/site/docs/current/reference/html/servlet-webclient.html#cas[ここ]にあります。

まず、Spring SecurityのCASモジュールに関連するBeanを設定しましょう。これにより、Spring Securityは中央認証サービスと連携することができます。

この点では、Spring Bootアプリケーションへのエントリポイントである CasSecuredAppApplication クラスに設定Beanを追加する必要があります。

@Bean
public ServiceProperties serviceProperties() {
    ServiceProperties serviceProperties = new ServiceProperties();
    serviceProperties.setService("http://localhost:9000/login/cas");
    serviceProperties.setSendRenew(false);
    return serviceProperties;
}

@Bean
@Primary
public AuthenticationEntryPoint authenticationEntryPoint(
  ServiceProperties sP) {

    CasAuthenticationEntryPoint entryPoint
      = new CasAuthenticationEntryPoint();
    entryPoint.setLoginUrl("https://localhost:6443/cas/login");
    entryPoint.setServiceProperties(sP);
    return entryPoint;
}

@Bean
public TicketValidator ticketValidator() {
    return new Cas30ServiceTicketValidator(
      "https://localhost:6443/cas");
}

@Bean
public CasAuthenticationProvider casAuthenticationProvider() {

    CasAuthenticationProvider provider = new CasAuthenticationProvider();
    provider.setServiceProperties(serviceProperties());
    provider.setTicketValidator(ticketValidator());
    provider.setUserDetailsService(
      s -> new User("casuser", "Mellon", true, true, true, true,
        AuthorityUtils.createAuthorityList("ROLE__ADMIN")));
    provider.setKey("CAS__PROVIDER__LOCALHOST__9000");
    return provider;
}

CasAuthenticationFilter が内部的にマップされるデフォルトのサービスログインURLを使用して ServiceProperties Beanを構成します。 ServiceProperties sendRenew プロパティは false に設定されています。結果として、ユーザーはログイン資格情報をサーバーに1回提示するだけで済みます。

その後の認証は自動的に、すなわちユーザにユーザ名とパスワードを再度尋ねることなく行われる。この動作は、認証に同じサーバーを使用する複数のサービスにアクセスできる単一のユーザーを意味します。

後で説明するように、ユーザーがサーバーから完全にログアウトすると、そのチケットは無効になります。その結果、ユーザーはサーバーに接続されているすべてのアプリケーションから同時にログアウトされます。これはシングルログアウトと呼ばれます。

AuthenticationEntryPoint BeanをサーバーのデフォルトのログインURLで構成します。このURLはサービスのログインURLとは異なることに注意してください。このサーバーログインURLは、認証のためにユーザーがリダイレクトされる場所です。

TicketValidator は、サーバーとの認証が成功したときにユーザーに付与されたサービスチケットを検証するためにサービスアプリが使用するBeanです。

流れは次のとおりです。

  1. ユーザーがセキュリティで保護されたページにアクセスしようとしました

  2. __AuthenticationEntryPoin __tがトリガーされ、ユーザーは次のことを行います.

サーバー。サーバーのログインアドレスは、 AuthenticationEntryPoint 。サーバーとの認証が成功すると、サーバーにリダイレクトします。

指定されたサービスURLに、 クエリパラメータとして追加されたサービスチケット 。 CasAuthenticationFilter は、パターンと一致するURLにマップされます

そして順番に、チケットの検証を内部でトリガーします。

  1. チケットが有効な場合、ユーザーは元のユーザーにリダイレクトされます.

リクエストされたURL

さて、いくつかのルートを保護して CasAuthenticationEntryPoint beanを使用するようにSpring Securityを設定する必要があります。

WebSecurityConfigurerAdapter を拡張する SecurityConfig.java を作成し、 config() をオーバーライドします。

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
      http
        .authorizeRequests()
        .regexMatchers("/secured.** ", "/login")
        .authenticated()
        .and()
        .authorizeRequests()
        .regexMatchers("/")
        .permitAll()
        .and()
        .httpBasic()
        .authenticationEntryPoint(authenticationEntryPoint);
    }
   //...
}

また、 SecurityConfig クラスでは、以下のメソッドをオーバーライドし、同時に CasAuthenticationFilter Beanを作成します。

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private AuthenticationProvider authenticationProvider;
    private AuthenticationEntryPoint authenticationEntryPoint;
    private SingleSignOutFilter singleSignOutFilter;
    private LogoutFilter logoutFilter;

    @Autowired
    public SecurityConfig(CasAuthenticationProvider casAuthenticationProvider, AuthenticationEntryPoint eP,
                          LogoutFilter lF
                          , SingleSignOutFilter ssF
    ) {
        this.authenticationProvider = casAuthenticationProvider;
        this.authenticationEntryPoint = eP;

        this.logoutFilter = lF;
        this.singleSignOutFilter = ssF;

    }

   //...

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.authenticationProvider(authenticationProvider);
    }

    @Override
    protected AuthenticationManager authenticationManager() throws Exception {
      return new ProviderManager(Arrays.asList(authenticationProvider));
    }

    @Bean
    public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sP) throws Exception {
      CasAuthenticationFilter filter = new CasAuthenticationFilter();
      filter.setServiceProperties(sP);
      filter.setAuthenticationManager(authenticationManager());
      return filter;
    }
}

/secure /login 、およびホームページへのリクエストを処理するコントローラを作成しましょう。

ホームページは index()メソッドを持つ IndexController__にマップされます。このメソッドは単にインデックスビューを返します。

@GetMapping("/")
public String index() {
    return "index";
}

/login パスは、 AuthController クラスの login() メソッドにマップされます。デフォルトのログイン成功ページにリダイレクトするだけです。

上記の HttpSecurity を設定する際に、認証が必要になるように /login パスを設定したことに注意してください。このようにして、認証のためにユーザーをCASサーバーにリダイレクトします。

このメカニズムは /login パスが保護されたルートではなく、ログインフォームを返す通常の設定とは少し異なります。

@GetMapping("/login")
public String login() {
    return "redirect:/secured";
}

/secure pathは、 SecuredPageController クラスの__index()メソッドにマップされます。認証されたユーザーのユーザー名を取得し、それをウェルカムメッセージの一部として表示します。

@GetMapping
public String index(ModelMap modelMap) {
  Authentication auth = SecurityContextHolder.getContext()
    .getAuthentication();
  if(auth != null
    && auth.getPrincipal() != null
    && auth.getPrincipal() instanceof UserDetails) {
      modelMap.put("username", ((UserDetails) auth.getPrincipal()).getUsername());
  }
  return "secure/index";
}

すべてのビューは cas-secure-app resources フォルダーにあります。この時点で、 cas-secure-app は認証にサーバーを使用できるはずです。

最後に、端末から build run を実行し、同時にSpringブートアプリも起動します。 SSLはこのプロセス全体の中で重要なので、上記のSSL生成ステップはスキップしないでください。

4.2. シングルログアウトの設定

システムからユーザーをログアウトさせて** 認証プロセスを進めましょう。ユーザーがログアウトできる場所は2つあります。クライアントアプリケーションとサーバーです。

ユーザーをクライアントアプリ/サービスからログアウトさせることが最初にすることです。

これは、同じサーバーに接続されている他のアプリケーションのユーザーの認証状態には影響しません。もちろん、ユーザーをサーバーからログアウトさせると、そのユーザーは他のすべての登録済みサービス/クライアントからもログアウトされます。

CasSecuredAppApplicaiton クラスでいくつかのBean設定を定義することから始めましょう:

@Bean
public SecurityContextLogoutHandler securityContextLogoutHandler() {
    return new SecurityContextLogoutHandler();
}

@Bean
public LogoutFilter logoutFilter() {
    LogoutFilter logoutFilter = new LogoutFilter(
      "https://localhost:6443/cas/logout",
      securityContextLogoutHandler());
    logoutFilter.setFilterProcessesUrl("/logout/cas");
    return logoutFilter;
}

@Bean
public SingleSignOutFilter singleSignOutFilter() {
    SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
    singleSignOutFilter.setCasServerUrlPrefix("https://localhost:6443/cas");
    singleSignOutFilter.setIgnoreInitConfiguration(true);
    return singleSignOutFilter;
}

@EventListener
public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener(
  HttpSessionEvent event) {
    return new SingleSignOutHttpSessionListener();
}

logoutFilter を設定して、URLパターン /logout/cas をインターセプトし、システム全体のログアウトのためにアプリケーションをサーバーにリダイレクトします。サーバーは関係するすべてのサービスに単一のログアウト要求を送信します。そのような要求は、HTTPセッションを無効にする__SingleSignOutFilterによって処理されます。

SecurityConfig クラスの config() HttpSecurity 設定を変更しましょう。以前に構成された CasAuthenticationFilter LogoutFilter がチェーンに追加されました。

http
  .authorizeRequests()
  .regexMatchers("/secured.** ", "/login")
  .authenticated()
  .and()
  .authorizeRequests()
  .regexMatchers("/")
  .permitAll()
  .and()
  .httpBasic()
  .authenticationEntryPoint(authenticationEntryPoint)
  .and()
  .logout().logoutSuccessUrl("/logout")
  .and()
  .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class)
  .addFilterBefore(logoutFilter, LogoutFilter.class);

ログアウトを正しく機能させるには、最初にユーザーをシステムからログアウトさせ、リンクを含むページを表示して、サーバーに接続されている他のすべてのサービスからユーザーをログアウトさせる logout() メソッドを実装する必要があります。

リンクは、上で設定した LogoutFilter のフィルタプロセスURLとして設定されたものと同じです。

@GetMapping("/logout")
public String logout(
  HttpServletRequest request,
  HttpServletResponse response,
  SecurityContextLogoutHandler logoutHandler) {
    Authentication auth = SecurityContextHolder
      .getContext().getAuthentication();
    logoutHandler.logout(request, response, auth );
    new CookieClearingLogoutHandler(
      AbstractRememberMeServices.SPRING__SECURITY__REMEMBER__ME__COOKIE__KEY)
      .logout(request, response, auth);
    return "auth/logout";
}

ログアウトビュー:

<html>
<head>
    <title>Cas Secured App - Logout</title>
</head>
<body>
<h1>You have logged out of Cas Secured Spring Boot App Successfully</h1>
<br>
<a href="/logout/cas">Log out of all other Services</a>
</body>
</html>

5 CASサーバーとデータベースの接続

認証には静的なユーザー認証情報を使用しています。ただし、実稼働環境では、ほとんどの場合、ユーザー資格情報はデータベースに格納されています。そこで、次に、私たちのサーバーをローカルで実行されているMySQLデータベースに接続する方法を示します。

これを行うには、 cas-server/src/main/resources ディレクトリの application.properties ファイルに次のデータを追加します。

cas.authn.accept.users=
cas.authn.accept.name=

cas.authn.jdbc.query[0].sql=SELECT **  FROM users WHERE email = ?
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=root
cas.authn.jdbc.query[0].ddlAuto=none
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].passwordEncoder.type=NONE

application.properties の全内容はソースコードにあります。 cas.authn.accept.users の値を空白のままにすると、サーバーによる静的ユーザーリポジトリの使用が無効になります

さらに、データベースからユーザーを取得するSQLステートメントを定義します。 SQL自体を構成する機能により、データベース内のユーザーの格納が非常に柔軟になります。

上記のSQLによると、ユーザーのレコードは users テーブルに格納されています。 email 列は、ユーザーのプリンシパル(ユーザー名)を表すものです。設定をさらに進めて、パスワードフィールドの名前 cas.authn.jdbc.query[0].fieldPasswordを設定します。さらに柔軟性を高めるために、 password__の値に設定します。

我々が設定した他の属性はデータベースユーザ( root )とパスワード(空白)、方言とJDBC接続__Stringです。/5.1.x/installation/JDBC-Drivers.html[ここ]。

  • もう1つの重要な属性は、パスワードの保存に使用される暗号化タイプです。** この場合は、NONEに設定されています。

ただし、サーバーはBcryptなどのより多くの暗号化メカニズムをサポートしています。

他の設定可能なプロパティと共にhttps://apereo.github.io/cas/5.1.x/installation/Configuration-Properties.html#database-authentication[here]にあるこれらの暗号化メカニズム

サーバーを実行する( build run) これで、構成されたデータベースに存在する資格情報を持つユーザーの認証が有効になります。 ** サーバが使用するデータベース内のプリンシパルは、クライアントアプリケーションのプリンシパルと同じでなければならないことに注意してください。

この場合、Spring Bootアプリは、プリンシパル( username) に対して、サーバーに接続されているデータベースと同じ値(リンク:/cdn-cgi/l/email-protection[[email protected]])を持つべきです。

次に、Spring Bootアプリケーションの CasSecuredAppApplication クラスに設定された CasAuthenticationProvider Beanに接続された UserDetails を変更しましょう。

@Bean
public CasAuthenticationProvider casAuthenticationProvider() {
    CasAuthenticationProvider provider = new CasAuthenticationProvider();
    provider.setServiceProperties(serviceProperties());
    provider.setTicketValidator(ticketValidator());
    provider.setUserDetailsService((s) -> new User(
      "[email protected]", "testU",
      true, true, true, true,
    AuthorityUtils.createAuthorityList("ROLE__ADMIN")));
    provider.setKey("CAS__PROVIDER__LOCALHOST__9000");
    return provider;
}

もう1つ注意すべきことは、 UserDetails にはパスワードが設定されていますが、使用されていないことです。ただし、ユーザー名がサーバーのユーザー名と異なる場合、認証は失敗します。

データベースに保存されている資格情報を使用してアプリケーションが正常に認証されるようにするには、127.0.0.1でポート3306を実行しているMySQLサーバーをユーザー名rootとパスワードrootで起動します。

それから、SQLファイル cas-server \ src \ main \ resources \ create test db and users tbl.sqlを使用します。これはhttps://github.com/eugenp/tutorials/tree/master/cas/cas-server[source codeの一部です。]をクリックして、データベース test にテーブル users を作成します。

デフォルトでは、電子メール [電子メール保護 ] とパスワード Mellonが含まれています。 application.properties.__のデータベース接続設定はいつでも変更できます。

6. 結論

Spring SecurityでCAS Server SSOを使用する方法と、関連する多くの設定ファイルを詳細に調べました。

テーマやプロトコルの種類から認証ポリシーに至るまで構成できるサーバーには、他にも多くの側面があります。これらはすべてhttps://apereo.github.io/cas/5.1.x/installation/Configuration-Properties.html[ここ]にあります。

この記事のサーバーのソースコードとその設定ファイルはhttps://github.com/eugenp/tutorials/tree/master/cas/cas-server[ここ]にあり、Spring Bootアプリケーションのものはhttps://github.com/eugenp/tutorials/tree/master/cas/cas-secured-app[ここ]が見つかりました。

前の投稿:Javaでクラス名を取得する
次の投稿:Javaを使ったActivitiのガイド