Я только что прочитал основную информацию для плагина ядра безопасности Spring Grails и установил его в свой проект Grail:
grails install-plugin spring-security-core
После этого я использовал s2-quickstart, предоставляемый плагином:
grails s2-quickstart com.springsecurity SpringUser SpringRole
Таким образом, в основном он создал необходимые контроллеры входа и выхода, контроллеры домена и некоторые файлы view / 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) в базе данных, и нет таблицы, поэтому он вызывает какое-то исключение.
Любая помощь будетвысоко ценится ...
Заранее спасибо ..