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 ..
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 {} –