Плагин Spring Security Core Grails Выпуск - PullRequest
0 голосов
/ 11 ноября 2010

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

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

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

Ответы [ 3 ]

3 голосов
/ 11 ноября 2010

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

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

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

1 голос
/ 29 ноября 2010

Наконец-то понял ...

Только что прокомментировал следующую строку в hibernate.cfg.xml

<property name="current_session_context_class">thread</property>
0 голосов
/ 15 ноября 2010

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

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

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

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

Hibernate hbm2ddl.auto возможные значения и что они делают?

Грант

...