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
1 2 3 |
<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
1 2 3 4 5 6 7 8 9 10 |
<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.
1 2 3 4 |
<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.
1 2 3 4 5 6 |
<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