3

最近はSpring Securityを使ってメソッドのアクセス権を制御しています。ページにアクセスすると、認証方法 (@PreAuthorize で指定) をトリガーして、ユーザーに権限があるかどうかを判断できます。

しかし、Spring のスケジュールされたジョブ (@Scheduled を使用したメソッド) を使用しています。つまり、メソッドはセッション コンテキストなしで自動的に実行されます。メソッドが @PreAuthorize を使用して何らかの関数を呼び出すと、認証を渡すことができません。アクセスが受け入れられたか拒否されたかを示す「true」または「false」は提供されません。次の例外が発生します。それは非常に迷惑です!

================================================== ================================

org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:325)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:196)
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:64)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy40.refreshGlobalCacheStrategyMetrics(Unknown Source)
at org.sly.main.server.service.system.scheduling.MaintenanceServiceImpl.runRecreateStrategyMetricsCache(MaintenanceServiceImpl.java:85)
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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:80)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.lang.Thread.run(Thread.java:662)

================================================== ================================

私はそれを理解しようと多くのページを検索しましたが、その最終的な解決策を見つけることができません.

springsource.org のページに問題が示されています。

http://static.springsource.org/spring-security/site/faq.html#auth-exception-credentials-not-found

1.5。「SecurityContext で認証オブジェクトが見つかりませんでした」というメッセージで例外が発生します。どうしたの?

これは、匿名ユーザーが保護されたリソースに初めてアクセスしようとしたときに発生する別のデバッグ レベル メッセージですが、フィルター チェーン構成に AnonymousAuthenticationFilter がない場合です。

DEBUG [ExceptionTranslationFilter] - 認証例外が発生しました。認証エントリ ポイント
org.springframework.security.AuthenticationCredentialsNotFoundException へのリダイレクト: org.springframework.security.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:342) の SecurityContext で認証オブジェクトが見つかりませんでした。 AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:254)

そして、 AnonymousAuthenticationFilter http://static.springsource.org/spring-security/site/docs/3.0.x/reference/anonymous.htmlを構成する方法を説明する別のページを見つけました

そのための構成は次のようにする必要があります。

<bean id="anonymousAuthFilter"
    class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">
  <property name="key" value="foobar"/>
  <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/>
</bean>

<bean id="anonymousAuthenticationProvider"
    class="org.springframework.security.authentication.AnonymousAuthenticationProvider">
  <property name="key" value="foobar"/>
</bean>

そのため、application-security.xml で構成しますが、違いはありません。

<beans:bean id="springSecurityFilterChain"
    class="org.springframework.security.web.FilterChainProxy">
    <security:filter-chain-map path-type="ant">
        <security:filter-chain pattern="/**"
            filters="anonymousAuthFilter" />
    </security:filter-chain-map>
</beans:bean>
<!-- ///////////////////////////////////////// -->
<!-- ////for AnonymousAuthenticationFilter//// -->
<!-- ///////////////////////////////////////// -->
<beans:bean id="anonymousAuthFilter"
    class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">
    <beans:property name="key" value="foobar" />
    <beans:property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS" />
</beans:bean>

<beans:bean id="anonymousAuthenticationProvider"
    class="org.springframework.security.authentication.AnonymousAuthenticationProvider">
    <beans:property name="key" value="foobar" />
</beans:bean>

春のセキュリティに堪能な人はいますか?

4

1 に答える 1

0

例外と構成から、認証プロセスがないことがわかります。これは、保護されたリソースへのアクセスに必要です。したがって、ページにリダイレクトされるはずentryPointです。

あなたのフィルター構成に基づくと、他のフィルターは見当たりません。これは奇妙です。名前空間またはフィルターチェーンを使用していますか? 後者の場合は、他のフィルターも追加します。タスクに必要なフィルターを見つけるために、これを確認する必要がある場合があります。

于 2012-08-09T05:28:58.683 に答える