Я только прочитал основную информацию о весенней безопасности ядра Grails плагина и установил его в моем Граале проекте:Spring Security Ядра Grails плагин Выпуск
grails install-plugin spring-security-core
После этого я использовал s2-быстрый старт предоставления плагин :
grails s2-quickstart com.springsecurity SpringUser SpringRole
Так в основном он создал требуется вход и выход, контроллеры домена и некоторый просмотр/GSP файлы для меня.
Теперь для целей тестирования мне нужно, чтобы проверить один из контроллера, так что я создал один контроллер образца, который называется также Достоверная следующим кодом:
package com.springsecurity;
import grails.plugins.springsecurity.Secured;
class SecureController {
@Secured(['ROLE_ADMIN'])
def index = {
render 'Secure access only'
}
}
Теперь из документации я нашел один этап, на котором он показывает мне, чтобы создать пользователя по умолчанию, и это роль от Bootstrap.groovy. Так что я должен написать следующий фрагмент кода в 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
Одна вещь, которую я хотел бы знать, является то, что я не создали таблицу еще во внутреннем интерфейсе. Так требуется на этом этапе, или приведенный выше код будет хранить одного пользователя в сеансе?
С выше кусок кода я получаю следующее исключение в момент запуска проекта:
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.
После просмотра выше ошибки, я чувствую себя, что это на самом деле пытается сохранить заданный объект (в Bootstrap .groovy) в базу данных, и нет таблицы, поэтому она бросает какое-то исключение.
Любая помощь будет высоко оценен ...
Заранее спасибо ..
1. Вы Бесполезный Я упоминал, что он создал классы домена SpringUser и SpringRole, но я полагаю, что это так. 2. Вы поместили этот код в метод init {} BootStrap? Операции класса домена должны работать там. 3. Вы можете попробовать просто удалить флеш: false, это не повредит функциональности, просто добавит больше обращений к DB. 4. Вы также можете попробовать сделать это в явной транзакции, например SpringRole.withTransaction {} –