Nell'articolo di oggi vedremo come integrare il CAS server con una base dati MySql e per comodità sfrutteremo la stessa di Liferay.

Se avete seguito i passi del precedente articolo dovreste avere la vostra istanza liferay attiva e funzionante con il meccanismo di autenticazione demandato al CAS, che si preoccupa di verificare se username e password sono uguali.

Nell'articolo precedente abbiamo usato la versione CAS messa a disposizione da Liferay, che è ferma alla versione 3.0.5 e pertanto installiamo la versione nuova 3.5.0 disponibile qui, che risulta essere più stabile e anche più esaustiva dal punto di vista dei log.

Scaricato il file sostituiamo, rinominiamo il file war in cas-web.war, in modo da non dover cambiare le impostazioni effettuate precedente su liferay.

Una volta attivo accediamo alla cartella webapp/cas-web/WEB-INF sotto la directory del tomcat e analizziamo il file deployerConfigContext.xml: in questo file sono definite le regole di autenticazione e nella configurazione di default troviamo il bean

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"></bean>

che come già detto applica come meccanismo di autenticazione che username e password coincidano.

Sostituiamo il bean con quello responsabile di implementare il meccanismo di autenticazione. Il cas mette a disposizione 3 implementazioni differenti:

  1. BindModeSearchDatabaseAuthenticationHandler (responsabile di verificare l'accesso ad uno schema db con una coppia username/password)
  2. QueryDatabaseAuthenticationHandler (responsabile di verificare l'autenticazione tramite una query sql)
  3. SearchModeSearchDatabaseAuthenticationHandler ( responsabile di verificare  l'autenticazione  partendo dalla tripletta tabella utente, username e password, opportunamente mappati)

Per integrare il bean occorre definire il datasource, tramite la seguente configurazione

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
      </property>
      <property name="url">
        <value>jdbc:mysql://localhost:3306/lportal</value>
      </property>
      <property name="username"><value>lportal</value></property>
      <property name="password"><value>lportal</value></property>
</bean>

e successivamente potete scegliere liberamente tra il secondo e il terzo bean, da sostituire al bean SimpleTestUsernamePasswordAuthenticationHandler.

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    <property name="dataSource" ref="dataSource" />
    <property name="sql" value="select password_ from user_ where lower(emailAddress) = lower(?)" />
</bean>
Nel caso del bean QueryDatabaseAuthenticationHandler  dovremo definire la query per ottenere la password da confrontare con quella inserita dall'utente.
<bean class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">
            <property name="tableUsers"><value>user_</value></property>
            <property name="fieldUser"><value>emailAddress</value></property>
            <property name="fieldPassword"><value>password_</value></property>
            <property name="dataSource" ref="dataSource"/>
 </bean>

Nel caso del bean SearchModeSearchDatabaseAuthenticationHandler dovremo specificare la tabella coinvolta e i campi su cui mappare username e password inseriti nel login del CAS.

Entrambi i bean considerano il caso di password salvate in chiaro. Siccome Liferay di default applica la codifica SHA dovete allineare il comportamento e avete di fronte due possibilità:

 

  1. configurare liferay in modo che salvi in chiaro le password, tramite la direttiva passwords.encryption.algorithm=NONE
  2. configurare i bean del CAS in modo da applicare l'algoritmo SHA. Per farlo occorre sfruttare il bean org.jasig.cas.authentication.handler.DefaultPasswordEncoder, scegliere la codifica desiderata e innestarli nel nostro bean.
Terminata la configurazione, occorre integrare le librerie necessarie alla comunicazione con il database e il gioco è fatto:
  • commons-pool
  • commons-dbcp
  • spring-jdbc-3.1.1