5

Spring Security スタックから 1 つのデフォルト フィルターを除外する必要があります。したがって、すべてのフィルターは通常どおり機能するはずです。そうする方法を見つけたようです。カスタム FilterChainProxy を作成します。

public class CustomFilterChainProxy extends FilterChainProxy {

Logger LOGGER = Logger.getLogger(CustomFilterChainProxy.class);

public CustomFilterChainProxy() {
    super();
    LOGGER.debug("Run custom filter proxy");
    LOGGER.debug("String filters: " + this.toString());
}

public CustomFilterChainProxy(SecurityFilterChain chain) {
    super(chain);
    LOGGER.debug("Run custom filter proxy with chains");
}
}

ご覧のとおり、フィルターのリストを取得するコンストラクターがあるため、必要に応じてチェーンからフィルターを 1 つ削除でき、残りはすべて通常どおりに機能します。しかし、そのようなコンストラクターのセキュリティ構成で Bean を作成することはできません。私が使用する場合

<bean id="filterChainProxy" class="com.pkg.CustomFilterChainProxy">

もちろん、デフォルトのコンストラクターでオブジェクトを構築します。わかりました、いくつかのフィルターのリストを使用して Bean を作成しようとします。

<bean id="filterChainProxy" class="ru.olekstra.backoffice.util.CustomFilterChainProxy">
<constructor-arg>
    <list>
        <sec:filter-chain pattern="/**" 
        filters="BasicUserApprovalFilter" />
    </list>
</constructor-arg>
</bean>

しかし、これはコンパイルされません。なぜなら、BasicUserApprovalFilter は不明な Bean だからです。では、既定のフィルター スタックから 1 つのフィルターを除外するにはどうすればよいでしょうか? カスタム フィルター チェーン プロキシを使用する方法が適切な決定である場合、デフォルトのフィルター チェーンを使用して Bean を作成するにはどうすればよいですか?

4

2 に答える 2

4

削除したいフィルターとその理由について詳細を教えていただければ、おそらく役立つでしょう。

必要に応じてBeanPostProcessor、フィルター チェーンを作成した後で、 を使用してフィルター チェーンを変更できます。<http>デフォルトの名前空間構成では、要素によって作成されたフィルター チェーンに名前を付けることができます。

<http name="myFilterChain">
   ...

SecurityFilterChainこれにより、この名前のタイプの Bean が登録されます。はFilterChainProxyこれらのリストから作成されます。

ポストプロセッサは次のようになります。

public class SecurityFilterChainPostProcessor implements BeanPostProcessor {

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        if (beanName.equals("myFilterChain")) {
            DefaultSecurityFilterChain fc = (DefaultSecurityFilterChain)bean;
            List<Filter> filters = fc.getFilters();

            // Modify the filter list as you choose here.                
            List<Filter> newFilters = ...

            return new DefaultSecurityFilterChain(fc.getRequestMatcher(), newFilters);
        }

        return bean;
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

次に、この Bean のインスタンスをアプリケーション コンテキストに登録するだけで、後は Spring が処理します。そうすれば、すべての Spring Security インフラストラクチャ フィルターを個別の Bean として定義する必要がなくなります。

アップデート

これは、実際の例その構成へのリンクです。

于 2013-01-09T18:57:11.593 に答える
1

SpringSecurity 構成の filter-chain-mapタグを使用して、独自のフィルター チェーンを定義できます。

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
    <security:filter-chain-map>
       <sec:filter-chain pattern="/**"
            filters="
        ConcurrentSessionFilterAdmin, 
        securityContextPersistenceFilter, 
        logoutFilterAdmin, 
        .....
        anonymousAuthenticationFilter, 
        sessionManagementFilterAdmin, 
        exceptionTranslationFilter, 
        filterSecurityInterceptorAdmin,
        MonitoringFilter"/> 
    </security:filter-chain-map>
</bean>
于 2013-01-09T14:53:38.813 に答える