4

ここに私の問題があります: ユーザーが API (基本的にすべての /myapi/** 要求) を使用しているときに、不要なセッションの作成を避けるために、Spring セキュリティ コア フィルターを使用したくありません。API は oauth トークンに基づいています。

そこで、ユーザー認証にプラグイン spring-security-core を使用し、Config.groovy ファイルに次のように追加しました。

grails.plugins.springsecurity.filterChain.chainMap = [
'/myapi/**': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-securityContextHolderAwareRequestFilter,-rememberMeAuthenticationFilter,-anonymousAuthenticationFilter,-exceptionTranslationFilter',
'/**':'JOINED_FILTERS'
]

基本的に、私が理解したことから、すべての/myapi/somethingに対してスプリングセキュリティフィルターを通過するべきではありませんが、実際には、セッションを作成するときにすべてのフィルターを通過します(/のセッションには何もありません) myapi/何か。

しかし、http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.htmlによると

そのため、以前のルールのいずれにも一致しない URL の最後に /** キャッチオール ルールが必要です。

そのため、リクエストがまだ /myapi/something のすべてのフィルターを通過している理由がわかりません。

私が行ったいくつかのテストは、役立つかもしれません:

私のConfig.groovyにあるだけの場合、セッションを作成していません:

grails.plugins.springsecurity.filterChain.chainMap = [
'/myapi/**': 'JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-securityContextHolderAwareRequestFilter,-rememberMeAuthenticationFilter,-anonymousAuthenticationFilter,-exceptionTranslationFilter'
]

ただし、他のフィルターを使用せずに他の URL のセッションを作成していないため、もちろんアプリケーションは機能しません。この例は、/myapi/something リクエストによってセッションが作成されていないことを確認するためのものです。

私が持っている場合:

grails.plugins.springsecurity.filterChain.chainMap = [
'/myapi/**': 'JOINED_FILTERS'
]

次に、すべての /myapi/something 要求に対してすべてのフィルターを通過し、セッションを作成します。他のリクエストにはフィルターを使用しません。例外行為です。

助けてくれてどうもありがとう、私は今それと戦ってきました、そしてどんなアイデアも大歓迎です!

どうもありがとう!良い一日を過ごしてください。

4

1 に答える 1

4

うん、私はまったく同じ問題に苦しんでいます!JOINED_FILTER は使用しませんが、次のようにフィルターを明示的に設定します。

grails.plugins.springsecurity.filterChain.chainMap = [
    '/apitest/**': 'requestContextAttributesFilter,sessionPreventionFilter,objectRepositoryCreationFilter',
    '/api/**':     'requestContextAttributesFilter,sessionPreventionFilter,objectRepositoryCreationFilter,apiAuthenticationFilter',
    '/**':         'requestContextAttributesFilter,securityContextPersistenceFilter,aisAuthenticationProcessingFilter'
]

「/apitest/*」URL にアクセスすると、キャッチオール ルールの最後のフィルタが実行されます。println と同様のチェーン マップのみを実行するいくつかのダミー フィルターを使用して単純な Grails プロジェクトを作成したとき、この問題を再現できませんでした。単純なテスト プロジェクトの場合、フィルターは期待どおりに機能しました。どのフィルタがいつ、なぜ実行されたのか、適切なログが記録されていないように見えるため、問題を特定することは非常に困難です。非常に奇妙な...

アップデート:

Spring Security Core プラグイン バージョン 1.2.7.2 を使用して、このエラーを再現できました。しかし、このバグはバージョン 1.2.7.3 で修正されたようです!

参照: http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10229&version=13100

バージョン 1.2.7.3 を使用すると、この問題が解決するようです。

于 2012-09-24T15:11:00.203 に答える