Seguici su:

Keycloak Mysql

Keycloak Mysql

Oggi vedremo come poter settare il database Mysql per Keycloak 3.4.3. Ci sono due metodi per poter fare questo: manualmente o usando jboss-cli.sh

Utilizzando jboss-cli.sh, il client di wildfly (dato che keycloak è costruito su wildfly) è molto più velece e sicuro dato che non si devono scrivere a mano le configurazioni del modulo  del connettore JDBC e non si deve modificare manualmente il file standalone.xml. In questo tutorial vedremo come configurare il connettore JDBC di mysql a mano passo passo con tutte le sue configurazioni

Prima di tutto scarichiamo keycloak e lo installiamo (attualmente alla versione 3.4.3)

wget https://downloads.jboss.org/keycloak/3.4.3.Final/keycloak-3.4.3.Final.tar.gz

Per installarlo basta estrarlo in una cartella qualsiasi (io userò ~/opt)

tar -xvf keycloak-3.4.3.Final.tar.gz

Prima di porte cambiare il database da H2 (predefinito) a Mysql dobbiamo lanciarlo e creare l’utente.

Questa fase è importante altrimenti si riceveranno degli errori perché keycloak creerà il database ma non lo inizializzerà con i dati predefiniti

cd keycloak-3.4.3.Final/bin

./standalone.sh

Una volta lanciato dobbiamo andare sul seguente indirizzo localhost:8080/auth di default keyclaok girerà sulla porta 8080 e creare l’utente admin

Creiamo user, database e relativi permessi in Mysql con i seguenti comandi

mysql -uroot -p

CREATE USER 'keycloak'@'%' IDENTIFIED BY 'keycloak';

CREATE DATABASE keycloak CHARACTER SET utf8 COLLATE utf8_unicode_ci;

GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'%';

Ora possiamo passare alla configurazione di Mysql per Keycloak. Per prima cosa scarichiamoci il connettore jdbc per mysql

wget -P ~/ https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.45.tar.gz

tar -xvf mysql-connector-java-5.1.45.tar.gz

Aggiungiamo il connettore ai moduli di keycloak creando le directory ...../com/mysql/main all’interno della cartella modules di keycloak  copiamo all’interno di main il connettore e creiamo un file module.xml

mkdir -p modules/system/layers/keycloak/com/mysql/main

cd modules/system/layers/keycloak/com/mysql/main

cp ~/mysql-connector-java-5.1.45/mysql-connector-java-5.1.45-bin.jar .

touch module.xml

Ora aprimao il file module.xml e scriviamo al suo interno il seguente codice

<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.3" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-5.1.45-bin.jar" />
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
  </dependencies>
</module>

A questo punto non ci resta che dichiarare i driver JDBC di mysql nel file standalone.xmlin /standalone/configuration

<subsystem xmlns="urn:jboss:domain:datasources:4.0">
  <datasources>
   ...
     <drivers>
        <driver name="mysql" module="com.mysql">
           <driver-class>com.mysql.jdbc.Driver</driver-class>
        </driver>      
        <driver name="h2" module="com.h2database.h2">
           <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
        </driver>
     </drivers>
  </datasources>
</subsystem>

Ora aggiungiamo il Datasource in modo che keycloak non usi più H2 (cancellandolo) come database ma il nostro database mysql creato in precedenza

<subsystem xmlns="urn:jboss:domain:datasources:4.0">
  <datasources>
     <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
       <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
         <driver>h2</driver>
         <security>
           <user-name>sa</user-name>
             <password>sa</password>
         </security>
     </datasource>
     <datasource jndi-name="java:/jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true">
        <connection-url>jdbc:mysql://localhost:3306/keycloak?useSSL=false&amp;characterEncoding=UTF-8</connection-url>
        <driver>mysql</driver>
        <pool>
           <min-pool-size>5</min-pool-size>
           <max-pool-size>15</max-pool-size>
         </pool>
         <security>
            <user-name>keycloak</user-name>
              <password>keycloak</password>
         </security>
         <validation>
             <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
             <validate-on-match>true</validate-on-match>
             <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
         </validation>
     </datasource>
     <drivers>
        <driver name="h2" module="com.h2database.h2">
            <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
        </driver>
        <driver name="mysql" module="com.mysql">
           <driver-class>com.mysql.jdbc.Driver</driver-class>
        </driver>
     </drivers>
  </datasources>
</subsystem>

ora possiamo lanciare keycloak e verificare nel database keycloak di mysql siano state create e inizializzate le tabelle

Pasquale Guarino

pasquale.guarino80@gmail.com