最近は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>
春のセキュリティに堪能な人はいますか?