| 

.NET C# Java Javascript Exception

Spring Secure und Datasources-Plugin

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Spring Secure und Datasources-Plugin

koeberle - 10.05.2010 18:17
Ich glaube ich habe ein Problem mit dem Zusammenspiel von acegi(5.2)- und dem Datasources-Plugin.
Die Konfiguration für die Connection zu den Domainklassen für Spring-Secure mache ich in der Datasources.groovy (von dem Datasources-Plugin nicht in der Standart-DataSource.groovy).
In meiner Bootstab.groovy kann ich ohne Probleme neue User und Rollen anlegen, die finde ich auch in der Datenbank.
Wenn ich mich jetzt aber einloggen möchte bekomme ich diese Meldung:
Caused by: java.sql.SQLException: invalid schema name: MYSCHEMA in statement
Das deutet alles darauf hin das Spring-Secure nicht auf die richtige Konfiguration zugreift. Den Fehler bekomme ich sonst immer wenn ich vergessen habe die Domainklassen für ein datasource in der Datasources.groovy anzumelden. Und Hibernate auf die Standart-DB (HSQL) von Grails zugreift.

Frage: Kennt jemand das Problem und wenn ja, kann man Spring-Secure dazu überreden die Konfigurationen des Datasources-Plugins zu nutzen, oder muss ich extra für Spring-Secure die DataSource.groovy benutzen (will ich möglichst vermeiden)?

Christian


Re: Spring Secure und Datasources-Plugin

mpuhlmann - 11.05.2010 11:28
Hallo,

bin auch über das Problem gestolpert. Grund hierfür ist das Acegi Plugin, welches zum Laden der User / Rollen die eigene Klasse org.codehaus.groovy.grails.plugins.springsecurity.GrailsDaoImpl verwendet. Diese widerum nutzt intern die Standard-SessionFactory. Somit gehen also alle Statements gegen die Default-DB. Hintergrund ist meines Erachtens, dass man beliebige Domain-Klassen für User und Roles definieren kann und somit den Zugriff abstrahieren/generalisieren muss.

Eine mögliche Lösung für das Problem wäre die Erstellung einer eigenen UserDetailsService-Implementation, welche die dynamischen Methoden der Domain-Objekte verwendet - und somit die jeweilige DB aus der Datasources.groovy Konfiguration.

Die eigene Klasse muss als userDetailsService in der Spring-Konfiguration definiert werden. Der AuthenticationService des Acegi-Plugins nutzt dann diese Implementation.

Eine extrem rudimentäre Implementation findest du hier:

import java.util.HashSet
import java.util.Set

import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserImpl
import org.springframework.dao.DataAccessException
import org.springframework.security.GrantedAuthority
import org.springframework.security.GrantedAuthorityImpl
import org.springframework.security.userdetails.UserDetails
import org.springframework.security.userdetails.UserDetailsService
import org.springframework.security.userdetails.UsernameNotFoundException

class CustomUserDetailsService implements UserDetailsService {

	@Override
	public UserDetails loadUserByUsername(String username)
			throws UsernameNotFoundException, DataAccessException {
		def user = User.findByUsername(username, [fetch:[authorities:'eager']])
		if (user) {
			GrantedAuthority[] authorities = user.authorities.collect { role -> new GrantedAuthorityImpl(role.authority) } as GrantedAuthority[]
			return new GrailsUserImpl(username, user.passwd, user.enabled, true, true, true, authorities, user);
		} else {
			throw new UsernameNotFoundException(username)
		}
	}
}

Wichtig ist das frühzeitige Fetching der authorities Relation, da es sonst zu einer LasyInitException kommt. Dies liegt wohl an irgendwelchen Transaktionsproblemen.

Hoffe, ich konnte dir weiter helfen.

Gruss

Marco

Anmerkung zur Beispiel-Implementation:
Die Implementation geht von Domain-Klassen für User und Role aus, welche über die Acegi Plugin Skripte erzeugt wurden.


Re: Spring Secure und Datasources-Plugin

thomasbee - 03.09.2010 23:34
Hallo,

ich hab jetzt wohl ein aehnliches Problem, allerdings nicht mit dem ACEGI, sondern mit dem neueren Spring Security Core Plugin. Ich versuche, das Plugin zusammen mit dem Datasources Plugin zu verwenden. Nachdem ich nachvollzogen hab, dass auch im neuen Plugin wohl ein Bug ist, der es nicht erlaubt, die Klassen User, Role, UserRole auf die sekundaeren DB zu mappen, versuche ich es andersrum, also User, Role, UserRole auf die primaere DB die in DataSource.groovy konfiguriert ist.

Dies klappt auch alles, ich kann mich einloggen und alles funktioniert bestens.

Wenn ich jetzt das Datasources Plugin installiere, kann ich mich - allein durch die Installation und das Anlegen einer primitiven Datasources.groovy config, welche ein simple domain class ohne relations auf die zweite DB mappt - NICHT MEHR einloggen. Am Ende des Einloggens bekomme ich eine lange SessionException, siehe unten.

Hat jemand es geschafft, die beiden Plugins zusammen ans laufen zu bringen?

Vielen Dank

Thomas

Language: Groovy
org.codehaus.groovy.grails.web.mapping.exceptions.UrlMappingException: Error mapping onto view [/index]: Session is closed! at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.renderViewForUrlMappingInfo(UrlMappingsFilter.java:263) at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:189) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent(GrailsPageFilter.java:245) at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:134) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) at org.codehaus.groovy.grails.plugins.springsecurity.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:40) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.codehaus.groovy.grails.plugins.springsecurity.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:79) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:104) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:67) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:69) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Thread.java:637) Caused by: org.hibernate.SessionException: Session is closed!


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Spring Secure und Datasources-Plugin" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.