1

BasicAuthenticationFilterを上書きし、それをフィルターに置き換えて、dbからカスタム認証オブジェクトをフェッチし、

SecurityContextHolder.getContext().setAuthentication(auth);

セキュリティ構成の重要な部分は次のとおりです。

<http use-expressions="true" entry-point-ref="authEntryPoint">
    <custom-filter position="BASIC_AUTH_FILTER" ref="basicProcessingFilter" />
    <intercept-url pattern="/**" access="hasRole('user')"/>
</http>
<beans:bean id="authEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/login"/>
</beans:bean>
<global-method-security jsr250-annotations="enabled"/>

また、独自のAuthenticationProviderも提供しています。これは、認証プロセスがカスタムフィルターで既に実行されているため、何も実行されません。

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    logger.info("user:" + authentication.getPrincipal() + " pw:" + authentication.getCredentials());
    authentication.setAuthenticated(false);        
    return authentication;
}

@Override
public boolean supports(Class<? extends Object> authentication) {
    return MyAuthentication.class.isAssignableFrom(authentication);
}

これで、Springは開始時にすべてのメソッドに必要な役割を正しく出力するため、アノテーションが正しく検出されます。たとえば、deleteメソッドの「admin」ロール:

2011-11-22 11:47:09,474 [main]DEBUGorg.springframework.security.access.method.DelegatingMethodSecurityMetadataSource-セキュリティメソッドの追加[CacheKey[com.somecompany.SomeClass; public com.somecompany.ReturnType com.somecompany.SomeClass.delete()]]属性[admin]

しかし、Springは、ユーザーがこの役割を持っているかどうかをどういうわけかチェックしません。代わりに、セキュリティコンテキストxmlファイルのhttpタグで定義されたグローバルパターンにフォールバックします。したがって、たとえば、roles:["user"]のユーザーを使用してこのdeleteメソッドにアクセスすると、httpタグにhasRole('user')があるため、このメソッドが受け入れられます。

おそらく、DefaultFilterInvocationSecurityMetadataSourceオブジェクトを初期化するときに、deleteメソッドの特定のルールが満たされないため、何か問題があります!?addSecureUrlメソッドを介して追加されるのは、httpタグで定義されたルールのみです。

何が間違っている可能性がありますか?

4

1 に答える 1

2

引っ越し

<global-method-security jsr250-annotations="enabled"/>

春のセキュリティコンテキストから、クラスを「スキャン」したコンテキスト(つまり、アプリケーションコンテキスト)までが役に立ちました。この回答のコメントに感謝します

于 2011-11-22T13:46:00.507 に答える