2010-11-11 38 views
0

Je viens de lire les informations de base pour le Grails de base de sécurité du printemps plug-in et il est installé dans mon projet graal:Spring Security base Grails Plugin Problème

grails install-plugin spring-security-core 

Après que je l'ai utilisé s2-QuickStart fournir par le plug-in :

grails s2-quickstart com.springsecurity SpringUser SpringRole 

donc, fondamentalement, il a créé des contrôleurs nécessaire Connexion et déconnexion, les contrôleurs de domaine et certains fichiers/vue gsp pour moi.

maintenant à des fins de test j'ai besoin de tester l'un des contrôleur, j'ai donc créé un contrôleur d'échantillon qui est nommé sécurisé avec code suivant:

package com.springsecurity; 
import grails.plugins.springsecurity.Secured; 

class SecureController { 
    @Secured(['ROLE_ADMIN']) 
    def index = { 
     render 'Secure access only' 
    } 
} 

maintenant de la documentation que j'ai trouvé une étape où il me montre pour créer un utilisateur par défaut et c'est le rôle de Bootstrap.groovy. Je dois donc écrire le morceau de code suivant dans Bootstrap.groovy:

def adminRole = new SpringRole(authority: 'ROLE_ADMIN').save(flush: false) 
def userRole = new SpringRole(authority: 'ROLE_USER').save(flush: false) 
String password = springSecurityService.encodePassword('password') 
def testUser = new SpringUser(username: 'me', enabled: true, password: password) 
testUser.save(flush: false) 
SpringUserSpringRole.create testUser, adminRole, true 
assert SpringUser.count() == 1 
assert SpringRole.count() == 2 
assert SpringUserSpringRole.count() == 1 

Une chose que je voudrais savoir ici est que je ne l'ai pas encore créé de table dans le back-end. Alors est-il nécessaire à cette étape ou le code ci-dessus va stocker l'utilisateur unique dans la session?

Avec morceau de code ci-dessus, je reçois suivant exception au moment de l'exécution du projet:

2010-11-11 11:42:47,932 [main] ERROR context.GrailsContextLoader - Error executing bootstraps: getFlushMode is not valid without active transaction 
org.hibernate.HibernateException: getFlushMode is not valid without active transaction 
     at $Proxy16.getFlushMode(Unknown Source) 
     at BootStrap$_closure1.doCall(BootStrap.groovy:29) 
     at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:251) 
     at grails.util.Environment.executeForEnvironment(Environment.java:244) 
     at grails.util.Environment.executeForCurrentEnvironment(Environment.java:220) 
     at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:164) 
     at grails.web.container.EmbeddableServer$start.call(Unknown Source) 
     at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158) 
     at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy) 
     at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280) 
     at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy) 
     at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149) 
     at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy) 
     at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116) 
     at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy) 
     at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59) 
     at RunApp$_run_closure1.doCall(RunApp.groovy:33) 
     at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381) 
     at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415) 
     at gant.Gant$_dispatch_closure7.doCall(Gant.groovy) 
     at gant.Gant.withBuildListeners(Gant.groovy:427) 
     at gant.Gant.this$2$withBuildListeners(Gant.groovy) 
     at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source) 
     at gant.Gant.dispatch(Gant.groovy:415) 
     at gant.Gant.this$2$dispatch(Gant.groovy) 
     at gant.Gant.invokeMethod(Gant.groovy) 
     at gant.Gant.executeTargets(Gant.groovy:590) 
     at gant.Gant.executeTargets(Gant.groovy:589) 
Application context shutting down... 
Application context shutdown. 

Après avoir vu l'erreur ci-dessus, je me sens qu'il est en train d'essayer de stocker l'objet spécifié (dans Bootstrap .groovy) à la base de données et il n'y a pas de table donc ça jette une exception.

Toute aide serait très apprécié ...

Merci à l'avance ..

+0

1. Vous didn Je n'ai pas mentionné qu'il a créé des classes de domaine SpringUser et SpringRole, mais je suppose que c'est le cas. 2. Avez-vous mis ce code dans la méthode init {} de BootStrap? Les opérations de classe de domaine devraient fonctionner là. 3. Vous pouvez essayer simplement de supprimer flush: false, cela ne nuira pas à la fonctionnalité, ajoutera simplement plus de roundtrips DB. 4. Vous pouvez également essayer de le faire en transaction explicite, comme SpringRole.withTransaction {} –

Répondre

1

Got finalement ...

Juste commenté la ligne suivante dans hibernate.cfg.xml

<property name="current_session_context_class">thread</property> 
+0

J'ai passé une demi-journée à la recherche d'une solution, merci – bbZ

3

Le message d'erreur est « getFlushMode est pas valide sans transaction active » qui n'a rien à voir avec l'existence sont des tables ou non.

Si vous utilisez dbCreate = create-drop ou dbCreate = update dans DataSource.groovy, alors toutes les tables de vos classes de domaine seront créées pour vous. Si vous avez désactivé dbCreate alors oui, vous devrez créer les tables associées, mais cela est nécessaire chaque fois que vous ajoutez une ou plusieurs classes de domaine à une application Grails. En regardant la liste de diffusion des utilisateurs de Grails, il semble que ce soit un conflit de fichier jar à partir de quelque chose que vous avez ajouté à votre répertoire lib ou quelque chose ajouté par un autre plugin. Un utilisateur a trouvé que Drools 4.0 était le problème lorsqu'il a vu cette erreur. Avez-vous des plugins qui incluent des fichiers Hibernate, ou d'autres bibliothèques dont Hibernate dépend, par ex. Antlr?

+0

Merci pour la réponse rapide ... Quand je commente les 9 lignes ajoutées pour créer l'utilisateur avec Bootstrap.groovy, il n'y a pas d'erreur de l'hibernation et le projet fonctionne bien ... Donc, cela signifie que l'erreur se produit en raison de ce morceau de code seulement ... – Nirmal

0

Je ne sais pas si vous avez vu cela, mais il y a une procédure pas à pas assez détaillée sur la façon de le faire ici:

http://blog.springsource.com/2010/08/11/simplified-spring-security-with-grails/

Plus précisément, il semble que votre code de mise en veille prolongée ne figure pas dans une session de mise en veille prolongée (que votre le code de test ne s'installe probablement pas correctement) et donc le message d'erreur. En règle générale, vous voulez configurer hibernate avec hibernate.hbm2ddl.auto pour avoir des tables auto-créer et autres.

Pour plus d'informations sur hibernate.hbm2ddl.auto vous pouvez regarder ici:

Hibernate hbm2ddl.auto possible values and what they do?

Grant