2

AngularJS で単一ページ アプリを実装するために、Grails 3.1.4 を Spring Security Rest Plugin 2.0.0.M2 と共に使用しています。ログインと検証は問題なく機能していますが、ログアウトを呼び出すと 404 エラーが発生します。

デバッグ時に、プラグイン 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"
}

例外:

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

通話中

tokenStorageService.loadUserByToken(accessToken.accessToken)

動作するので、トークンは確かに tokenStorage にあります。

私のSpring Securityの構成は

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']
]

私の設定にエラーがありますか、それとも何か問題がありますか?

4

1 に答える 1

2

質問をして数分後に答えが見つかりました。

Spring Security Restプラグインのドキュメントには次のように記載されています。

サーバーに状態が保持されないため、JWT トークン (デフォルトの戦略) を使用する場合、ログアウトはできません。それでもログアウトが必要な場合は、JwtTokenStorageService のサブクラスを作成し、storeToken メソッドと removeToken メソッドをオーバーライドすることで、独自の実装を提供できます。次に、実装を resources.groovy に tokenStorageService として登録します。

ただし、より合理的なアプローチは、クライアント (ブラウザーのローカル ストレージなど) からトークンを削除し、トークンを期限切れにすることです (アクセスのたびに更新される Memcached や Redis などの他のストレージとは異なり、いずれにせよトークンは期限切れになります)。 .

したがって、認証に JWT を使用している場合は、クライアントでトークンを削除するだけで十分です。

于 2016-03-26T18:30:36.187 に答える