Tutorial Liferay 2 - Integrare il Cas Server con Liferay
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:
- BindModeSearchDatabaseAuthenticationHandler (responsabile di verificare l'accesso ad uno schema db con una coppia username/password)
- QueryDatabaseAuthenticationHandler (responsabile di verificare l'autenticazione tramite una query sql)
- 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à:
- configurare liferay in modo che salvi in chiaro le password, tramite la direttiva passwords.encryption.algorithm=NONE
- 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.
- commons-pool
- commons-dbcp
- spring-jdbc-3.1.1