0

名前空間を使用せずに(Springセキュリティを使用して)アプリケーションにインターセプトメソッドを追加しようとしています。

これが私がしたことです:
最初に、あなたが見ることができるように、私は「methodSecurityInterceptor」という名前のfilter-chain-mapにフィルターを追加しました:

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
    <security:filter-chain-map path-type="ant">
        <sec:filter-chain pattern="/css/**" filters="none" />
        <sec:filter-chain pattern="/images/**" filters="none" />
        <sec:filter-chain pattern="/login.jsp*" filters="none" />
        <sec:filter-chain pattern="/**"
            filters="
        ConcurrentSessionFilter,
        securityContextPersistenceFilter,
        sessionManagementFilter,
        authenticationProcessingFilter,
        exceptionTranslationFilter,
        filterSecurityInterceptor,
        methodSecurityInterceptor,
        logoutFilter" />
    </security:filter-chain-map>
</bean>



次に、そのBeanを次のように紹介しました。

<bean id="methodSecurityInterceptor"
class="org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="securityMetadataSource" ref="MyMethodMetdataSource">

    </property>
</bean> 

<bean id="MyMethodMetdataSource" class="com.datx.dao.MyMethodMetdataSource">
</bean>


そして、MyMethodMetadataSourceを次のように実装しました。

public class MyMethodMetdataSource extends AbstractMethodSecurityMetadataSource{

@Override
public Collection<ConfigAttribute> getAttributes(Method arg0, Class<?> arg1) {

    String url = arg0.getName();
    List<ConfigAttribute> attributes = new ArrayList<ConfigAttribute>();

    attributes = getAttributesByURL2(url); //Here is my function which
                                           //returns corresponding roles

    return attributes;
}
    @Override
public Collection<ConfigAttribute> getAllConfigAttributes() {
    // TODO Auto-generated method stub
    return null;
}


どうやら私はmethodSecurityInterceptorを使用することを許可されていません。それはフィルターではないからです!
だから私は何をすべきですか?
私はこれを読みましたが、Spring AOPのプロキシメカニズムの1つでそれを使用する方法がわかりません!

だから...何か考えはありますか?

4

2 に答える 2

2

前に示した例は<global-method-security>、名前空間要素を使用せずに作成できるのと同じくらい単純です。

保護するメソッドに一致するポイントカットでSpring のAOP 名前空間を使用します。

<aop:config>
  <aop:pointcut id='targetMethods' expression='execution(* org.springframework.security.TargetObject.*(..))'/>
  <aop:advisor advice-ref='securityInterceptor' pointcut-ref='targetMethods' />
</aop:config>

セキュリティインターセプターを Bean として宣言します。

<bean id='target' class='org.springframework.security.TargetObject'/>
<bean id='securityInterceptor' class='org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor' autowire='byType' >
   <property name='securityMetadataSource' ref="yourSecurityMetadataSource"/>
</bean>

その Bean への外部呼び出しは、メソッドが呼び出される前にセキュリティ インターセプターを介してルーティングされます。

以前に AOP を使用したことがない場合は、ソースをチェックアウトし、デバッガーでテストを実行して動作の感触をつかむことをお勧めします。

于 2012-07-02T14:00:30.490 に答える
1

幸いなことに、私はこの質問に対する答えを見つけました。
インターセプト法にフィルターを使用することはできません。そのため、代わりにプロキシを使用することをお勧めします。

解決策は次のとおりです。
フィルター チェーンを通常の状態に戻します。

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<security:filter-chain-map path-type="ant">
    <sec:filter-chain pattern="/css/**" filters="none" />
    <sec:filter-chain pattern="/images/**" filters="none" />
    <sec:filter-chain pattern="/login.jsp*" filters="none" />
    <sec:filter-chain pattern="/**"
        filters="
    ConcurrentSessionFilter,
    securityContextPersistenceFilter,
    sessionManagementFilter,
    authenticationProcessingFilter,
    exceptionTranslationFilter,
    filterSecurityInterceptor,
    logoutFilter" />
</security:filter-chain-map>


私がそこで何をしたか見てください。methodSecurityInterceptor を削除しました。

次に、プロキシを追加します。

<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="interceptorNames">
        <list>
            <value>methodSecurityInterceptor</value> <!-- Responsible for checking roles and accesspaths -->
        </list>
    </property>
    <property name="beanNames">
        <list>
            <value>Manager2</value> <!--The Class that I want to protect its methods -->
        </list>
    </property>
</bean>


もちろん、これらの Bean をアプリケーション コンテキストにも追加する必要があります。

<bean id="methodSecurityInterceptor"
    class="org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor">
        <property name="authenticationManager" ref="authenticationManager" />
        <property name="accessDecisionManager" ref="accessDecisionManager" />
        <property name="securityMetadataSource" ref="MyMethodMetdataSource">            
        </property>
    </bean>
<bean id="MyMethodMetdataSource" class="com.datx.dao.MyMethodMetdataSource">
</bean>


それでは始めましょう :)

これで、Manager2.java のすべてのメソッドがすべてのメソッド呼び出しに対してチェックされます。

于 2012-07-03T05:07:29.833 に答える