2016-03-26 11 views
2

Ich benutze Grails 3.1.4 zusammen mit dem Spring Security Rest Plugin 2.0.0.M2 für die Implementierung einer einzelnen Seite App mit AngularJS. Anmeldung und Validierung funktioniert einwandfrei, aber wenn ich abmelde ich bekomme einen Fehler 404.Grails Spring Security Rest Logout

Wenn das Debuggen, erhalte ich eine Ausnahme in der Plugin RestLogoutFilter:

try { 
    log.debug "Trying to remove the token" 
    tokenStorageService.removeToken accessToken.accessToken 
} catch (TokenNotFoundException tnfe) { 
    servletResponse.sendError HttpServletResponse.SC_NOT_FOUND, "Token not found" 
} 

Ausnahme:

grails.plugin.springsecurity.rest.token.storage.TokenNotFoundException: 
Token eyJh... cannot be removed as this is a stateless implementation 

Aufruf

tokenStorageService.loadUserByToken(accessToken.accessToken) 

Werke, so das Token ist sicherlich in der tokenStorage .

My Spring Security-Konfiguration ist

grails.plugin.springsecurity.userLookup.userDomainClassName = 'myapp.User' 
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'myapp.UserRole' 
grails.plugin.springsecurity.authority.className = 'myapp.Role' 
grails.plugin.springsecurity.userLookup.usernamePropertyName='email' 
grails.plugin.springsecurity.rest.login.usernamePropertyName='email' 
grails.plugin.springsecurity.rest.token.storage.gorm.usernamePropertyName='email' 
grails.plugin.springsecurity.rest.logout.endpointUrl = '/api/logout' 
grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
     [pattern: '/',    access: ['permitAll']], 
     [pattern: '/error',   access: ['permitAll']], 
     [pattern: '/index',   access: ['permitAll']], 
     [pattern: '/index.gsp',  access: ['permitAll']], 
     [pattern: '/shutdown',  access: ['permitAll']], 
     [pattern: '/assets/**',  access: ['permitAll']], 
     [pattern: '/**/js/**',  access: ['permitAll']], 
     [pattern: '/**/css/**',  access: ['permitAll']], 
     [pattern: '/**/images/**', access: ['permitAll']], 
     [pattern: '/**/favicon.ico', access: ['permitAll']], 
     [pattern: '/api/logout',  access: ['isAuthenticated()']] 
] 

grails.plugin.springsecurity.filterChain.chainMap = [ 
     [pattern: '/assets/**',  filters: 'none'], 
     [pattern: '/**/js/**',  filters: 'none'], 
     [pattern: '/**/css/**',  filters: 'none'], 
     [pattern: '/**/images/**', filters: 'none'], 
     [pattern: '/**/favicon.ico', filters: 'none'], 
     [pattern: '/api/**',  filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'] 
] 

Gibt es einen Fehler in meiner Config oder eine andere Sache falsch?

Antwort

1

Die Antwort Minuten nach dem Stellen der Frage gefunden.

Die Spring Security Erholung plugin documentation Staaten:

Logout nicht möglich ist, wenn JWT-Token (die Standardstrategie), da kein Staat im Server gehalten wird. Wenn Sie sich weiterhin abmelden möchten, können Sie eine eigene Implementierung bereitstellen, indem Sie eine Unterklasse von JwtTokenStorageService erstellen und die Methoden storeToken und removeToken überschreiben. Dann registrieren Sie Ihre Implementierung in resources.groovy als tokenStorageService. Ein vernünftigerer Ansatz wäre es jedoch, das Token vom Client zu entfernen (z. B. den lokalen Speicher des Browsers) und die Token ablaufen zu lassen (sie laufen trotzdem ab, anders als bei anderen Speichern wie Memcached oder Redis, wo sie aktualisiert werden) bei jedem Zugriff).

Das Löschen des Tokens auf dem Client ist also ausreichend, wenn JWT zur Autorisierung verwendet wird.