CAS SSO mit Federsicherheit

CAS SSO Mit Frühlingssicherheit

1. Überblick

In diesem Artikel werden wir unsintegrating the Central Authentication Service (CAS) with Spring Security ansehen. CAS ist ein SSO-Dienst (Single Sign-On).

Angenommen, wir haben Anwendungen, die eine Benutzerauthentifizierung erfordern. Die gebräuchlichste Methode ist die Implementierung eines Sicherheitsmechanismus für jede Anwendung. Es ist jedoch besser, die Benutzerauthentifizierung für alle Apps an einem Ort zu implementieren.

Genau das leistet das CAS SSO-System. Diesesarticle enthält weitere Details zur Architektur. Das Protokolldiagramm kannhere gefunden werden.

2. Projekteinrichtung und -installation

Das Einrichten eines zentralen Authentifizierungsdienstes umfasst mindestens zwei Komponenten. Eine Komponente ist ein Spring-basierter Server namenscas-server. Andere Komponenten bestehen aus einem oder mehreren Clients.

Ein Client kann eine beliebige Webanwendung sein, die den Server zur Authentifizierung verwendet.

2.1. CAS Server Setup

Der Server verwendet den Maven (Gradle) War Overlay-Stil, um die Einrichtung und Bereitstellung zu vereinfachen. Es gibt eine Schnellstartvorlage, die geklont und verwendet werden kann.

Lass es uns klonen:

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

Dieser Befehl klont diecas-overlay-template in das Verzeichniscas-server auf dem lokalen Computer.

Als Nächstes fügen wir dem Stammpom.xml zusätzliche Abhängigkeiten hinzu. Diese Abhängigkeiten ermöglichen die Serviceregistrierung über eine JSON-Konfiguration.

Außerdem erleichtern sie Verbindungen zur Datenbank:


    org.apereo.cas
    cas-server-support-json-service-registry
    ${cas.version}


    org.apereo.cas
    cas-server-support-jdbc
    ${cas.version}


    org.apereo.cas
    cas-server-support-jdbc-drivers
    ${cas.version}

Die neueste Version der Abhängigkeitencas-server-support-json-service-registry,cas-server-support-jdbc undcas-server-support-jdbc-drivers befindet sich in Maven Central. Bitte beachten Sie, dass das übergeordnetepom.xml die Artefaktversionen automatisch verwaltet.

Als nächstes erstellen wir den Ordnercas-server/src/main/resources und kopieren den Ordnercas-server/etc. hinein. Wir werden auch den Port der Anwendung sowie den Pfad des SSL-Schlüsselspeichers ändern.

Wir konfigurieren diese, indem wir die zugehörigen Einträge incas-server/src/main/resources/application.properties bearbeiten:

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

Der Pfad des Konfigurationsordners wurde ebenfalls aufclasspath:/etc/cas/config festgelegt. Es zeigt aufcas-server/src/main/resources/etc/cas/config.

Der nächste Schritt ist das Generieren eines lokalen SSL-Schlüsselspeichers. Der Schlüsselspeicher wird zum Herstellen von HTTPS-Verbindungen verwendet. Dieser Schritt ist wichtig und darf nicht übersprungen werden.

Wechseln Sie vom Terminal aus incas-server/src/main/resources/etc/cas. Führen Sie anschließend den folgenden Befehl aus:

keytool -genkey -keyalg RSA -alias thekeystore -keystore thekeystore
-storepass changeit -validity 360 -keysize 2048

It’s important to use localhost when prompted for a first and last name, Organisationsname und sogar Organisationseinheit. Andernfalls kann beim SSL-Handshake ein Fehler auftreten. Andere Felder wie Stadt, Bundesland und Land können entsprechend eingestellt werden.

Der obige Befehl generiert einen Schlüsselspeicher mit dem Namenthekeystore und dem Kennwortchangeit.. Er wird im aktuellen Verzeichnis gespeichert.

Als nächstes muss der generierte Schlüsselspeicher in ein.crt-Format exportiert werden, damit er von den Clientanwendungen verwendet werden kann. Führen Sie den folgenden Befehl aus, um die generiertethekeystore-Datei nachthekeystore.crt. zu exportieren. Das Kennwort bleibt unverändert:

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

Importieren wir nun die exportiertenthekeystore.crt in den Javacacerts-Schlüsselspeicher. Die Terminal-Eingabeaufforderung sollte sich weiterhin im Verzeichniscas-server/src/main/resources/etc/casbefinden.

Führen Sie von dort aus den folgenden Befehl aus:

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

Zweifelsohne können wir das Zertifikat auch in eine JRE importieren, die sich außerhalb der JDK-Installation befindet:

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

Beachten Sie, dass das Flag-keystore auf den Speicherort des Java-Schlüsselspeichers auf dem lokalen Computer verweist. Dieser Speicherort kann je nach vorhandener Java-Installation unterschiedlich sein.

Darüber hinaus sindensure that the JRE that is referenced as the location of the key store is the same as the one that is used for the client application.

Nach dem erfolgreichen Hinzufügen vonthekeystore.crt zum Java-Schlüsselspeicher müssen wir das System neu starten. Entsprechend können wir jede Instanz der JVM beenden, die auf dem lokalen Computer ausgeführt wird.

Als nächstes rufencas-server, aus dem Stammprojektverzeichnis die Befehlebuild package undbuild run vom Terminal aus auf. Das Starten des Servers kann einige Zeit dauern. Wenn es fertig ist, wird READY in der Konsole gedruckt.

Zu diesem Zeitpunkt wird beim Besuch vonhttps://localhost:6443/cas mit einem Browser ein Anmeldeformular gerendert. Der Standardbenutzername istcasuser und das Passwort istMellon.

2.2. CAS-Client-Setup

Verwenden Sie dieSpring Initializr, um das Projekt mit den folgenden Abhängigkeiten zu generieren: Web, Sicherheit, Freemarker und optional DevTools.

Fügen Sie zusätzlich zu den von Spring Initializr generierten Abhängigkeiten die Abhängigkeit für das Spring Security CAS-Modul hinzu:


    org.springframework.security
    spring-security-cas

Die neueste Version der Abhängigkeit finden Sie inMaven Central. Konfigurieren Sie auch den Port des Servers so, dass Port 9000 überwacht wird, indem Sie den folgenden Eintrag inapplication.properties: hinzufügen

server.port=9000

3. Registrieren von Diensten / Clients bei CAS Server

Der Server erlaubt nicht jedem Client, zur Authentifizierung darauf zuzugreifen. Dieclients/services must be registered in the CAS server services registry.

Es gibt verschiedene Möglichkeiten, einen Dienst beim Server zu registrieren. Dazu gehören YAML, JSON, Mongo, LDAP undothers.

Abhängig von der Methode müssen Abhängigkeiten in die Dateipom.xmlaufgenommen werden. In diesem Artikel verwenden wir die JSON Service Registry-Methode. Die Abhängigkeit war bereits im vorherigen Abschnitt in der Dateipom.xmlenthalten.

Erstellen wir eine JSON-Datei, die die Definition der Clientanwendung enthält. Erstellen Sie im Ordnercas-server/src/main/resourceseinen weiteren Ordner -services. Dieser Ordnerservicesenthält die JSON-Dateien.

Als Nächstes erstellen wir eine JSON-Datei mit dem NamencasSecuredApp-19991.json im Verzeichniscas-server/src/main/resources/services mit folgendem Inhalt:

{
    "@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
}

Das AttributserviceId definiert ein Regex-URL-Muster für die Clientanwendung, die den Server zur Authentifizierung verwenden möchte. In diesem Fall stimmt das Muster mit einer Anwendung überein, die auf localhost ausgeführt wird und Port 9000 überwacht.

Das Attributidollte eindeutig sein, um Konflikte zu vermeiden und versehentlich Konfigurationen zu überschreiben. Der Name der Dienstkonfigurationsdatei folgt der KonventionserviceName-id.json. Andere konfigurierbare Attribute wietheme,proxyPolicy,logo,privacyUrl und andere könnenhere gefunden werden.

Fügen Sie zunächst zwei weitere Konfigurationselemente hinzu, um die JSON-Dienstregistrierung zu aktivieren. Eine besteht darin, den Server über das Verzeichnis zu informieren, in dem sich die Dienstkonfigurationsdateien befinden. Die andere Möglichkeit besteht darin, die Initialisierung der Dienstregistrierung über JSON-Konfigurationsdateien zu aktivieren.

Diese beiden Konfigurationselemente werden in einer anderen Datei mit dem Namencas.properties. abgelegt. Wir erstellen diese Datei im Verzeichniscas-server /src/main/resources:

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

Führen Sie den Befehlbuild run erneut aus und notieren Sie sich Zeilen wie "Loaded [3] service(s) from [JsonServiceRegistryDao]" auf der Konsole.

4. Spring-Sicherheitskonfiguration

4.1. Single Sign-On konfigurieren

Nachdem die Spring Boot-Anwendung beim CAS-Server als Dienst registriert wurde. Lassen Sie unsconfigure Spring Security to work in concert with the server für die Benutzerauthentifizierung verwenden. Die vollständige Abfolge der Interaktionen zwischen Spring Security und Server finden Sie inhere.

Konfigurieren wir zunächst die Beans, die sich auf das CAS-Modul von Spring Security beziehen. Auf diese Weise kann Spring Security mit dem zentralen Authentifizierungsdienst zusammenarbeiten.

Insofern müssen wir derCasSecuredAppApplication-Klasse, dem Einstiegspunkt in die Spring Boot-Anwendung, Konfigurations-Beans hinzufügen:

@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;
}

Wir konfigurieren dieServiceProperties-Bean mit der Standard-Service-Anmelde-URL, der dieCasAuthenticationFilter intern zugeordnet werden. DiesendRenew-Eigenschaft vonServiceProperties wird auffalse gesetzt. Infolgedessen muss ein Benutzer dem Server nur einmal seine Anmeldeinformationen vorlegen.

Die nachfolgende Authentifizierung erfolgt automatisch, d. H. Ohne den Benutzer erneut nach Benutzername und Passwort zu fragen. Dieses Verhalten bedeutet, dass ein einzelner Benutzer Zugriff auf mehrere Dienste hat, die denselben Server zur Authentifizierung verwenden.

Wie wir später sehen werden, ist sein Ticket ungültig, wenn sich ein Benutzer vollständig vom Server abmeldet. Infolgedessen wird der Benutzer gleichzeitig von allen mit dem Server verbundenen Anwendungen abgemeldet. Dies wird als Single Logout bezeichnet.

Wir konfigurieren dieAuthenticationEntryPoint Bean mit der Standard-Anmelde-URL des Servers. Beachten Sie, dass sich diese URL von der Service-Anmelde-URL unterscheidet. Diese Server-Anmelde-URL ist der Speicherort, an den der Benutzer zur Authentifizierung umgeleitet wird.

TicketValidator ist die Bean, die die Service-App verwendet, um ein Service-Ticket zu validieren, das einem Benutzer nach erfolgreicher Authentifizierung beim Server gewährt wurde.

Der Fluss ist:

  1. Ein Benutzer versucht, auf eine gesicherte Seite zuzugreifen

  2. DieAuthenticationEntryPoint wird ausgelöst und bringt den Benutzer zum Server. Die Anmeldeadresse des Servers wurde inAuthenticationEntryPointangegeben

  3. Bei einer erfolgreichen Authentifizierung beim Server wird die Anforderung an die angegebene Dienst-URL zurückgeleitet, wobei das Dienst-Ticket als Abfrageparameter angehängt wird

  4. CasAuthenticationFilter wird einer URL zugeordnet, die dem Muster entspricht, und löst wiederum die Ticketvalidierung intern aus.

  5. Wenn das Ticket gültig ist, wird ein Benutzer zur ursprünglich angeforderten URL umgeleitet

Jetzt müssen wir Spring Security konfigurieren, um einige Routen zu schützen und dieCasAuthenticationEntryPoint-Bean zu verwenden.

Erstellen wirSecurityConfig.java, dieWebSecurityConfigurerAdapter erweitern, und überschreiben Sieconfig():

@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);
    }
    // ...
}

Außerdem überschreiben wir in der KlasseSecurityConfig die folgenden Methoden und erstellen gleichzeitig die BeanCasAuthenticationFilter:

@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;
    }
}

Erstellen wir Controller, die Anforderungen verarbeiten, die an/secured,/login und die Homepage gerichtet sind.

Die Homepage wird einemIndexController zugeordnet, der eine Methodeindex(). hat. Diese Methode gibt lediglich die Indexansicht zurück:

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

Der Pfad von/loginwird der Methodelogin() aus der KlasseAuthController zugeordnet. Es wird nur auf die Standardseite für die erfolgreiche Anmeldung umgeleitet.

Beachten Sie, dass wir bei der Konfiguration vonHttpSecurity oben den Pfad von/logino konfiguriert haben, dass eine Authentifizierung erforderlich ist. Auf diese Weise leiten wir den Benutzer zur Authentifizierung an den CAS-Server weiter.

Dieser Mechanismus unterscheidet sich ein wenig von der normalen Konfiguration, bei der der Pfad von/loginkeine geschützte Route ist und ein Anmeldeformular zurückgibt:

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

Der Pfad von/securedwird der Methodeindex() aus der KlasseSecuredPageController zugeordnet. Es ruft den Benutzernamen des authentifizierten Benutzers ab und zeigt ihn als Teil der Willkommensnachricht an:

@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";
}

Beachten Sie, dass alle Ansichten im Ordnerresources voncas-secured-app verfügbar sind. Zu diesem Zeitpunkt solltencas-secured-app den Server zur Authentifizierung verwenden können.

Schließlich führen wirbuild run vom Terminal aus und starten gleichzeitig auch die Spring-Boot-App. Beachten Sie, dass SSL der Schlüssel für diesen gesamten Prozess ist. Daher sollte der obige Schritt zur SSL-Generierung nicht übersprungen werden!

4.2. Single Logout konfigurieren

Fahren wir mitthe authentication process by logging out a user vom System fort. Es gibt zwei Orte, an denen sich ein Benutzer abmelden kann: die Client-App und den Server.

Als Erstes müssen Sie einen Benutzer von der Client-App / dem Client-Dienst abmelden. Dies hat keine Auswirkungen auf den Authentifizierungsstatus des Benutzers in anderen Anwendungen, die mit demselben Server verbunden sind. Wenn Sie einen Benutzer vom Server abmelden, wird der Benutzer natürlich auch von allen anderen registrierten Diensten / Clients abgemeldet.

Beginnen wir mit der Definition einiger Bean-Konfigurationen in der KlasseCasSecuredAppApplicaiton:

@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();
}

Wir konfigurieren dielogoutFilter so, dass sie das URL-Muster/logout/cas abfangen und die Anwendung für eine systemweite Abmeldung auf den Server umleiten. Der Server sendet eine einzelne Abmeldeanforderung an alle betroffenen Dienste. Eine solche Anforderung wird vonSingleSignOutFilter, verarbeitet, wodurch die HTTP-Sitzung ungültig wird.

Ändern Sie die Konfiguration vonHttpSecurityin der Klasseconfig()vonSecurityConfig. Die zuvor konfiguriertenCasAuthenticationFilter undLogoutFilter werden jetzt ebenfalls zur Kette hinzugefügt:

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);

Damit die Abmeldung ordnungsgemäß funktioniert, sollten wir einelogout()-Methode implementieren, die zuerst einen Benutzer lokal vom System abmeldet und eine Seite mit einem Link anzeigt, um den Benutzer optional von allen anderen mit dem Server verbundenen Diensten abzumelden.

Der Link ist derselbe wie der, der als Filterprozess-URL für die oben konfiguriertenLogoutFilter festgelegt wurde:

@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";
}

Die Logout-Ansicht:



    Cas Secured App - Logout


You have logged out of Cas Secured Spring Boot App Successfully


Log out of all other Services

5. Verbinden des CAS-Servers mit einer Datenbank

Wir haben statische Benutzeranmeldeinformationen zur Authentifizierung verwendet. In Produktionsumgebungen werden Benutzeranmeldeinformationen jedoch die meiste Zeit in einer Datenbank gespeichert. Als nächstes werdenwe show how to connect our server to a MySQL database (database name: test) lokal ausgeführt.

Dazu hängen wir die folgenden Daten an die Dateiapplication.properties im Verzeichniscas-server/src/main/resourcesan:

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

Denken Sie daran, dass der vollständige Inhalt vonapplication.properties im Quellcode enthalten ist. Leaving the value of cas.authn.accept.users blank deactivates the use of static user repositories by the server.

Außerdem definieren wir die SQL-Anweisung, mit der die Benutzer aus der Datenbank abgerufen werden. Die Möglichkeit, SQL selbst zu konfigurieren, macht die Speicherung von Benutzern in der Datenbank sehr flexibel.

Gemäß der obigen SQL wird ein Benutzerdatensatz in der Tabelleusersgespeichert. Die Spalteemailrepräsentiert den Principal (Benutzernamen) des Benutzers. Weiter unten in der Konfiguration setzen wir den Namen des Passwortfeldscas.authn.jdbc.query[0].fieldPassword.. Wir setzen ihn auf den Wertpassword, um die Flexibilität weiter zu erhöhen.

Weitere von uns konfigurierte Attribute sind der Datenbankbenutzer (root) und das Kennwort (leer), der Dialekt und die JDBC-VerbindungString.. Die Liste der unterstützten Datenbanken, verfügbaren Treiber und Dialekte finden Sie unterhere .

Another essential attribute is the encryption type used for storing the password. In diesem Fall wird NONE festgelegt.

Der Server unterstützt jedoch weitere Verschlüsselungsmechanismen, z. B. Bcrypt. Diese Verschlüsselungsmechanismen könnenhere zusammen mit anderen konfigurierbaren Eigenschaften gefunden werden.

Das Ausführen des Servers (build run) ermöglicht jetzt die Authentifizierung von Benutzern mit Anmeldeinformationen, die in der konfigurierten Datenbank vorhanden sind. Note again that the principal in the database that the server uses must be the same as that of the client applications.

In diesem Fall sollte die Spring Boot-App für den Principal (username)) denselben Wert ([email protected]) haben wie für die mit dem Server verbundene Datenbank.

Ändern Sie dann dieUserDetails, die mit derCasAuthenticationProvider-Bean verbunden sind, die in derCasSecuredAppApplication-Klasse der Spring Boot-Anwendung konfiguriert ist:

@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;
}

Beachten Sie auch, dassUserDetails zwar ein Passwort erhalten, aber nicht verwendet wird. Wenn sich der Benutzername jedoch von dem des Servers unterscheidet, schlägt die Authentifizierung fehl.

Damit sich die Anwendung erfolgreich mit den in der Datenbank gespeicherten Anmeldeinformationen authentifiziert, starten Sie einen MySQL-Server unter 127.0.0.1 und Port 3306 mit dem Benutzernamen root und dem Kennwort root.

Verwenden Sie dann die SQL-Dateicas-server\src\main esources\create_test_db_and_users_tbl.sql,, die Teil vonsource code ist, um die Tabelleusers in der Datenbanktest zu erstellen.

Standardmäßig enthält es die E-Mail[email protected] und das PasswortMellon.. Denken Sie daran, dass wir die Einstellungen für die Datenbankverbindung immer inapplication.properties. ändern können

Starten Sie den CAS-Server erneut mitbuild run,. Gehen Sie zuhttps://localhost:6443/cas und verwenden Sie diese Anmeldeinformationen zur Authentifizierung. Die gleichen Anmeldeinformationen gelten auch für die cas-gesicherte Spring Boot-App.

6. Fazit

Wir haben uns ausführlich mit der Verwendung von CAS Server SSO mit Spring Security und vielen der beteiligten Konfigurationsdateien befasst.

Es gibt viele andere Aspekte eines Servers, die konfiguriert werden können, von Themen und Protokolltypen bis hin zu Authentifizierungsrichtlinien. Diese finden Sie alle inhere in den Dokumenten.

Der Quellcode für den Server in diesem Artikel und die Konfigurationsdateien befinden sich inhere und der der Spring Boot-Anwendung inhere.