2010-11-11 3 views
0

Я только прочитал основную информацию о весенней безопасности ядра 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) в базу данных, и нет таблицы, поэтому она бросает какое-то исключение.

Любая помощь будет высоко оценен ...

Заранее спасибо ..

+0

1. Вы Бесполезный Я упоминал, что он создал классы домена SpringUser и SpringRole, но я полагаю, что это так. 2. Вы поместили этот код в метод init {} BootStrap? Операции класса домена должны работать там. 3. Вы можете попробовать просто удалить флеш: false, это не повредит функциональности, просто добавит больше обращений к DB. 4. Вы также можете попробовать сделать это в явной транзакции, например SpringRole.withTransaction {} –

ответ

1

Понял, наконец ...

Просто заметил следующую строку в hibernate.cfg.xml

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

Я потратил полдня на поиск решения, спасибо – bbZ

3

сообщение об ошибке «getFlushMode не является действительным без активной транзакции», которая не имеет ничего общего с ли являются таблицами или нет.

Если вы используете dbCreate = create-drop или dbCreate = update в DataSource.groovy, тогда для вас будут созданы все таблицы для ваших классов домена. Если вы отключили dbCreate, то да, вам нужно будет создать связанные таблицы, но это необходимо при каждом добавлении одного или нескольких классов домена в приложение Grails.

Глядя на список рассылки пользователей Grails, похоже, что это конфликт файла jar из-за того, что вы добавили в ваш каталог lib или что-то, добавленное другим плагином. Один пользователь обнаружил, что проблема Drools 4.0 была проблемой, когда он увидел эту ошибку. У вас есть плагины, которые включают баны Hibernate или другие библиотеки, от которых зависит Hibernate. Antlr?

+0

Спасибо за быстрый ответ ... Когда я комментирую 9 строк, добавленных для создания пользователя с помощью Bootstrap.groovy, нет ошибки из спящего режима и проекта работает нормально ... Так что это означает, что ошибка возникает из-за этого фрагмента кода ... – Nirmal

0

Не уверен, что если бы вы видели это, но есть довольно подробное пошаговое руководство о том, как сделать это здесь:

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

В частности, кажется, что ваш код спящего режима не содержится в спящем сессии (которой ваш тестовый код, вероятно, неправильно настроен) и, следовательно, сообщение об ошибке. Обычно вы хотите настроить hibernate с помощью hibernate.hbm2ddl.auto, чтобы он автоматически создавал таблицы и т. Д.

Дополнительную информацию о hibernate.hbm2ddl.авто вы можете посмотреть здесь:

Hibernate hbm2ddl.auto possible values and what they do?

Грант

Смежные вопросы