Wie implementiere ich eine benutzerdefinierte FilterSecurityInterceptor mit grails 1.3.2-und plugin-spring-security-core 1?
Schreibe ich ein grails 1.3.2 Anwendung und Implementierung von security mit spring-security-core-1.0. Für Gründe, die außerhalb des Geltungsbereichs dieses Frage, ich bin Implementierung einer benutzerdefinierten FilterSecurityInterceptor zusätzlich zu den out-of-the-box-Abfangjäger. Ich habe angefangen mit einem blog-Eintrag auf das Thema und versucht zu justieren für Spring Security 3, ohne viel Erfolg.
Locker nach dem blog (seit es ist basierend auf einer älteren version von Spring Security), habe ich die folgenden Klassen:
- Eine org.springframework.Sicherheit.die Authentifizierung.AbstractAuthenticationToken Unterklasse zu halten, meine Anmeldeinformationen.
- Eine org.springframework.Sicherheit.die Authentifizierung.AuthenticationProvider Unterklasse zu implementieren, die die Authentifizierung und unterstützt Methoden zum Auffüllen eines Authentifizierungs-Instanz mit den Daten von meinem UserDetailsService.
- Eine org.springframework.Sicherheit.web.- Zugang.abzufangen.FilterSecurityInterceptor Unterklasse zu implementieren doFilter und afterPropertiesSet Methoden.
- Einige Konfiguration der beans und der spring-security-core-plugin zu erkennen meine AuthenticationProvider und legen Sie meinen filter in die filter-Kette.
Meine AbstractAuthenticationToken ist ziemlich einfach:
class InterchangeAuthenticationToken extends AbstractAuthenticationToken {
String credentials
Integer name
Integer principal
String getCredentials() { //necessary or I get compilation error
return credentials
}
Integer getPrincipal() { //necessary or I get compilation error
return principal
}
}
Meine AuthenticationProvider ist ziemlich einfach:
class InterchangeAuthenticationProvider implements org.springframework.security.authentication.AuthenticationProvider {
Authentication authenticate(Authentication customAuth) {
def authUser = AuthUser.get(customAuth.principal)
if (authUser) {
customAuth.setAuthorities(authUser.getAuthorities())
customAuth.setAuthenticated(true)
return customAuth
} else {
return null
}
}
boolean supports(Class authentication) {
return InterchangeAuthenticationToken.class.isAssignableFrom(authentication)
}
}
Ich habe implementiert eine triviale FilterSecurityInterceptor. Schließlich muss es etwas Interessantes:
class InterchangeFilterSecurityInterceptor extends FilterSecurityInterceptor implements InitializingBean {
def authenticationManager
def interchangeAuthenticationProvider
def securityMetadataSource
void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
if (SecurityContextHolder.getContext().getAuthentication() == null) {
def myAuth = new InterchangeAuthenticationToken()
myAuth.setName(1680892)
myAuth.setCredentials('SDYLWUYa:nobody::27858cff')
myAuth.setPrincipal(1680892)
myAuth = authenticationManager.authenticate(myAuth);
if (myAuth) {
println "Successfully Authenticated ${userId} in object ${myAuth}"
//Store to SecurityContextHolder
SecurityContextHolder.getContext().setAuthentication(myAuth);
}
}
chain.doFilter(request, response)
}
void afterPropertiesSet() {
def providers = authenticationManager.providers
providers.add(interchangeAuthenticationProvider)
authenticationManager.providers = providers
}
}
Schließlich muss ich konfigurieren, einige Bohnen:
beans = {
interchangeAuthenticationProvider(com.bc.commerce.core.InterchangeAuthenticationProvider) {
}
interchangeFilterSecurityInterceptor(com.bc.commerce.core.InterchangeFilterSecurityInterceptor) {
authenticationManager = ref('authenticationManager')
interchangeAuthenticationProvider = ref('interchangeAuthenticationProvider')
securityMetadataSource = ref('objectDefinitionSource')
}
}
Und einige Konfiguration des plugins:
grails.plugins.springsecurity.dao.hideUserNotFoundExceptions = true //not setting this causes exception
grails.plugins.springsecurity.providerNames = [
'interchangeAuthenticationProvider',
'daoAuthenticationProvider',
'anonymousAuthenticationProvider',
'rememberMeAuthenticationProvider'
]
Und setzen Sie den filter, um in Bootstrap.groovy:
def init = {servletContext ->
//insert our custom filter just after the filter security interceptor
SpringSecurityUtils.clientRegisterFilter('interchangeFilterSecurityInterceptor', SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order + 10)
<snip />
}
Wenn ich eine URL bekomme ich folgende exception, die stümpfe mich:
2010-07-30 15:07:16,763 [http-8080-1] ERROR [/community-services].[default] - Servlet.service() for servlet default threw exception
java.lang.NullPointerException
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:171)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:106)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:112)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
at org.codehaus.groovy.grails.plugins.springsecurity.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:40)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.codehaus.groovy.grails.plugins.springsecurity.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149)
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:67)
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:66)
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:637)
So, wo bin ich Durcheinander, oder habe ich diese zu Komplex und habe ich etwas verpasst einfach?
InformationsquelleAutor Chris Alef | 2010-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
In das Ende, ich implementiert eine benutzerdefinierte filter, nicht aber eine FilterSecurityInterceptor. Ich steckte meinen filter nach dem OOTB rememberMe-filter. Zudem fand ich meine Authentifizierung Umsetzung etwas zu ressourcenintensiv und zu langsam, so machte ich es den rememberMe cookie auf der erfolgreichen Authentifizierung. Insgesamt war dies eine schmerzhafte Erfahrung, so werde ich den Versuch machen, zu dokumentieren es hier.
Meiner filter-Implementierung wurde wie folgt:
Hoffentlich andere finden das hilfreich bei der Umsetzung Ihrer benutzerdefinierten Authentifizierungs-Lösungen. Wir fanden, dies war für uns bei der Integration unserer Anwendung mit unserem alten system.
InformationsquelleAutor Chris Alef
Gegeben, wo es fehlschlägt (eher nicht) würde ich sagen, dass es die verschachtelte Eigenschaften. Versuchen
Meine Vermutung ist, dass es beim zurücksetzen der rest der Konfiguration (Grails/ConfigSlurper quirk) und dass dies die Zusammenführung der Eigenschaften statt. Sie sollten nicht brauchen, setzen Sie "active = true", aber ich vermute, Sie benötigt, um hinzuzufügen, dass, da es ist auch immer zurückgesetzt.
btw - Sie können entfernen Sie die Getter aus InterchangeAuthenticationToken werden, da öffentliche Felder generieren von Getter automatisch.
Stellen Sie sicher, dass Sie 'grails clean' zu zwingen, eine vollständige Neukompilierung. Sie könnten auch installieren Sie die spring-security-ui-plugin die info-Seiten zeige die eingetragene Authentifikatoren, Filter, Eigenschaften, etc. und Sie können Sie verwenden, um zu überprüfen, dass die Dinge einrichten, wie Sie es erwarten.
InformationsquelleAutor Burt Beckwith
Dies scheint ein bug in der spring-security-core-plugin, weil die
securityMetadataSource
ist nicht injiziert in das Standard-spring security -FilterSecurityInterceptor
. Vielleicht ist das plugin Durcheinander kommt und injiziertsecurityMetadataSource
in Ihre benutzerdefiniertenFilterSecurityInterceptor
und vernachlässigt die anderen (Standard -)? Burt möglicherweise bereit, tiefer zu schauen info.Vielleicht könnten Sie versuchen ersetzen die Standard -
FilterSecurityInterceptor
mit Ihren custom one mit dergrails.plugins.springsecurity.filterNames
Eigenschaft...InformationsquelleAutor Ryan Heaton