Hibernate, JAVA, ROO, Spring, Spring Security, Uncategorized

Come creare un authentication-provider personalizzato con spring security 3 e Hibernate

All’interno di Spring Security è possibile definire il modo in cui quest’ultimo deve interagire con le informazioni utente per il loro reperimento e i successivi controlli per il login, in poche parole configurare il meccanismo di autenticazione.

La parte dedicata a ciò è l’authentication-manager che si trova dentro il file applicationContext-security.xml.

<!– Configure Authentication mechanism –>
<authentication-manager alias=”authenticationManager”>
<authentication-provider user-service-ref=”CustomUserServiceDetails”/>
</authentication-manager>
All’interno possiamo trovare il tag authentication-provider che ci permette la definizione di quale tecnologia dobbiamo utilizzare per gestire l’autenticazione, ad esempio tramite jdbc o ldap.

Nel nostro caso invece vogliamo ridefinire tutto il processo di autenticazione o meglio personalizzarlo in modo che reperisca le informazioni direttamente da Hibernate e creando nuovi ruoli legati all’utente che ci permettano di rendere la navigazione di quest’ultimo più semplice utilizzando direttamente gli strumenti nativi.

Nel tag authentication-provider è presente l’attributo user-service-ref che permette di refenziare un classe definita all’interno di spring security, nel nostro caso ad esempio:

<beans:bean id=”CustomUserServiceDetails” class=”com.gruppomcr.xxx.security.CustomUserServiceDetailsImpl” />

La classe CustomUserServiceDetailsImpl implementa l’interfaccia UserDetailsService che permette di redifinire il metodo loadUserByUsername, questo metodo ci permette di:
  • reperire le informazioni sulla username dell’utente che si stà loggando
  • personalizzare le informazioni che verranno salvate nell’oggetto UserDetails all’interno della sessione di spring security
  • utilizzare le informazioni personalizzate per meglio utilizzare gli strumenti nativi che ci offre spring

Continua a leggere

Annunci
Hibernate

[Errore] Caused by: org.hibernate.DuplicateMappingException: Duplicate collection {nome collection} mapping

Partendo dalla situazione in cui ho:

  • STS 2.3.2 con Eclipse 3.5
  • JBoss tools 2.0.2
  • Mi trovo nella vista HIBERNATE

e

  • Fatto il reverse engeenering del mio DB con JBoss Tools
  • Configurato JBoss tools in modo che sappia:
    • i parametri di connessione al DB
    • Il path e il nome del file hibernate.cfg.xml che non è altro che lo stesso creato precedentemente dal reverse engeneering
    • importato nella sezione Mappings di configurations, tutti i file hbm.xml che sono stati creati dal reverse engeneeing (che poi non sono altro le il mappaggio delle mie classi java)

Quando cerco di vedere il risultato della configurazione per poter eseguire una query con l’editor HQL. Ho il seguente errore:

Error Caused by: org.hibernate.DuplicateMappingException: Duplicate collection {nome collection} mapping

Questo errore nel mio caso è dovuto al fatto che vi era un riferimento duplicato per i file  hbm.xml infatti se li importo tramite la configurazione nella sezione Mappins non possono essere presenti anche nel file hibernate.cfg.xml.

Perciò per risolvere il problema basterà cancellare la lista di file hbm.xml dentro il file hibernate.cfg.xml e finalmente potrete utilizzare l’editor HQL

Hibernate, Mysql, ROO, Spring, tc Server
Questa guida vuole essere un piccolo punto di riferimento per la costruzione di un DataSource all’interno dell’ambiente tc Server di Spring Tool Suite, nella fattispecie utilizzando Mysql 5 come DB e Hibernate come Framework per la persistenza.
La Guida è stata testa sia per STS 2.3.2 che per STS 2.3.3

Cambiamenti da effettuare all’interno di:

Server > [SpringSource tc Server v6.0-config | SpringSource tc Developer 2.0 ] (files che si trovano dentro il workspace, creati automaticamente da STS 2.3.2)

context.xml:
All’interno del tag <Context>

<Resource     name="${Nome data source}” 
                auth="Container" 
                type="javax.sql.DataSource" 
                  maxActive="10" 
                  maxIdle="10" 
                  maxWait="10000" 
                  username="root" 
                  password="root" 
                  driverClassName="com.mysql.jdbc.Driver" 
                url="jdbc:mysql://localhost:3306/${nome database utilizzato}"/>

server.xml
Dentro il tag <GlobalNamingResources>

<Resource     name="${Nome data source} 
                auth="Container" 
                type="javax.sql.DataSource" 
                  maxActive="10" 
                  maxIdle="10" 
                  maxWait="10000" 
                  username="root" 
                  password="root" 
                  driverClassName="com.mysql.jdbc.Driver" 
                url="jdbc:mysql://localhost:3306/${nome database utilizzato}"/>

web.xml
Subito dopo il tag <webapp>

    <description>MySQL Test App</description>
      <resource-ref>
          <description>DB Connection Mysql</description>
          <res-ref-name>${nome datasource}</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          <res-auth>Container</res-auth>
      </resource-ref>

PS: il nome del datasource deve essere sempre lo stesso



Cambiamenti da effettuale all’interno del nostro progetto:

web.xml
Subito dopo il tag <webapp>

    <description>MySQL Test App</description>
      <resource-ref>
          <description>DB Connection Mysql</description>
          <res-ref-name>${nome datasource}</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          <res-auth>Container</res-auth>
      </resource-ref>

PS: il nome del datasource deve essere sempre lo stesso


Nella cartella che contiene il server (es: /opt/springsource/tc server 6)

Inserire i driver JDBC connector nella cartella TOMCAT\lib (nel caso di Developer 2)

Inserire i driver JDBC connector nelle cartelle webapps-lib e lib (nel caso di Server v6.0)

Hibernate, Mysql

[Hibernate + mysql] Errore “Found longblob expected blob”

Se trovate l’errore segnalato in grassetto in cui hibernate va in errore visto che si aspetta di trovare nella tabella un campo LONGBLOB, mentre invece la classe entity definisce un BLOB.

GRAVE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘transactionManager’ defined in file [/opt/STS 2.3.2/tc-server-6.0.20.C/wtpwebapps/GestioneFIR/WEB-INF/classes/META-INF/spring/applicationContext.xml]
….
….
Caused by: org.hibernate.HibernateException: Wrong column type in gestione_fir.categoria for column regolamento_xml.
Found: longblob, expected: blob at org.hibernate.mapping.Table.validateColumns(Table.java:261)