2011-01-26 2 views
4

Я разбиваю приложение grails на модули с помощью плагинов, а затем добавляю встроенные плагины в BuildConfig.groovy. Прямо сейчас у меня есть приложение grails под названием «admin» и плагин под названием «common».Grails Inline Plugins и Spring Security

«общий» плагин содержит все объекты моего общего домена, а также установлен плагин весенне-защищенного ядра. Насколько я понимаю, мне также необходимо установить плагин spring-security-core в «admin», поэтому я это сделал.

Я запускал s2-quickstart на 'common', и он содержит сопоставления домена для пользователя и роли внутри Config.groovy. Когда я запускаю приложение, он перенаправляется соответствующим образом на защищенный контент (через аннотацию @Secured). Однако, когда я пытаюсь выполнить аутентификацию, он все еще пытается запросить Person вместо User.

Я добавил сопоставления домена из «common» Config.groovy в «admin», и теперь запрос работает, но он не может найти дополнительные свойства, которые я добавил в домен пользователя, который существует в «общем» плагин.

Я что-то упустил? Я бы предпочел не ставить пользователя и роль в приложение «admin», так как я хочу иметь возможность повторно использовать пользователя и роль в другом приложении, которое также использует «общий» плагин.

UPDATE: Я понял, что у меня установлены конфликтующие плагины с плагинами с пружиной (копирование и вставка). Я решил, что он очистил проблему, пытаясь найти Личность вместо Пользователя. Теперь, однако, я получаю следующий стек:

java.lang.NullPointerException: Cannot get property 'clazz' on null object 

at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:56) 

at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:156) 

at org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java:44) 

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:235) 

at org.codehaus.groovy.grails.plugins.springsecurity.GormUserDetailsService.loadUser(GormUserDetailsService.groovy:80) 

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

at java.lang.reflect.Method.invoke(Method.java:597) 

at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:266) 

at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:51) 

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:153) 

at org.codehaus.groovy.grails.plugins.springsecurity.GormUserDetailsService.loadUserFromSession(GormUserDetailsService.groovy:72) 

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

at java.lang.reflect.Method.invoke(Method.java:597) 

at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:88) 

at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 

at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1058) 

at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1070) 

at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:886) 

at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1003) 

at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1070) 

at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:886) 

at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) 

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:157) 

at org.codehaus.groovy.grails.plugins.springsecurity.GormUserDetailsService$_loadUserByUsername_closure1.doCall(GormUserDetailsService.groovy:57) 

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

at java.lang.reflect.Method.invoke(Method.java:597) 

at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:88) 

at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 

at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1058) 

at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1070) 

at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:886) 

at groovy.lang.Closure.call(Closure.java:276) 

at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:51) 

at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:79) 

at $Proxy17.doInTransaction(Unknown Source) 

at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) 

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

at java.lang.reflect.Method.invoke(Method.java:597) 

at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:188) 

at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52) 

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124) 

at org.codehaus.groovy.grails.plugins.springsecurity.GormUserDetailsService.loadUserByUsername(GormUserDetailsService.groovy:59) 

at org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserDetailsService$loadUserByUsername.callCurrent(Unknown Source) 

at org.codehaus.groovy.grails.plugins.springsecurity.GormUserDetailsService.loadUserByUsername(GormUserDetailsService.groovy:68) 

at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:86) 

at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:129) 

at org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:130) 

at org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:48) 

at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:97) 

at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 

at org.codehaus.groovy.grails.plugins.springsecurity.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:40) 

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378) 

at org.codehaus.groovy.grails.plugins.springsecurity.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:79) 

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378) 

at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378) 

at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:167) 

at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 

at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

at org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:104) 

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69) 

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

at org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:65) 

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 

at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 

at java.lang.Thread.run(Thread.java:680) 
+0

Добавление сопоставлений домена в Config.groovy администратора разрешило эту проблему, но я не уверен, почему я должен это делать. – Gregg

+1

Config.groovy плагина используется для его локальной разработки, тестирования и т. Д., Но не экспортируется, поэтому в Config.groovy приложения должны быть настройки. Вероятно, вы можете настроить вещи в doWithApplicationContext в «общем» плагине, поскольку это выполняется до того, как будут предприняты какие-либо попытки аутентификации. –

+0

Спасибо, Берт. Я взгляну на этот подход. Кстати, готов ответить на вопрос о плагине ui-performance. Поэтому держите глаза открытыми. :) – Gregg

ответ

5

Так советоваться Берт, я добавил следующее в моем CommonGrailsPlugin.groovy ..

def doWithApplicationContext = { applicationContext -> 
    SpringSecurityUtils.securityConfig.userLookup.userDomainClassName = 'com.wbr.common.security.User' 
    SpringSecurityUtils.securityConfig.userLookup.authorityJoinClassName = 'com.wbr.common.security.UserRole' 
    SpringSecurityUtils.securityConfig.authority.className = 'com.wbr.common.security.Role' 
} 

Это удерживает меня от того, чтобы скопировать этот конфиг во все которые зависят от этого плагина. И поскольку этим приложениям не нужно настраивать эту конфигурацию, она отлично работает! Спасибо, Берт!

0

Вот что происходит. Для обеспечения гибкости плагин безопасности позволяет вам определить класс, который вы используете для обеспечения безопасности в conf/Config.gs. Затем он динамически загружает этот класс, делая

def User = AH.application.getDomainClass(SpringSecurityUtils.securityConfig.userLookup.userDomainClassName).clazz) 

и используя класс пользователя. Если вы изменили имя класса и не изменили конфигурацию, вы получите эту ошибку.

+0

Это не то, что вызывало мою проблему. Это то, что происходит, когда вы используете плагины так, как я их использую. Берт был прав в своем комментарии. – Gregg

1

Просто убедитесь, что следующие строки соответствуют вашим именам объектов пакета и домена в conf/Config.groovy. Изменение имен пакетов и объектов соответственно

// Added by the Spring Security Core plugin: 
grails.plugins.springsecurity.userLookup.userDomainClassName = 'THIS.IS.THE PACKAGE.Person' 
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'THIS.IS.THE.PACKAGE.PersonAuthority' 
grails.plugins.springsecurity.authority.className = 'THIS.IS.THE.PACKAGE.Authority' 
+0

Это не то, что вызывало мою проблему. Берт решил это в своем комментарии. – Gregg