1

RESTFul ウェブサーバーとしてjerseyを使用しています。(jersey-server 1.8) 春 (3.2.0.RELEASE) と休止状態。私のエンドポイントは、2 脚の oAuth 1.0a (spring-security-oauth 1.0.0.M4) で spring-security (3.1.3.RELEASE) を使用して保護されています。

すべてが期待どおりに機能し、保護が機能します。ConsumerDetailsS​​erviceImpl (ConsumerDetailsS​​ervice、UserDetailsS​​ervice、AuthenticationProvider を実装) 内で、さまざまな例外をスローします (現在はすべて OAuthException の形式ですが、独自のカスタム例外を追加したい)

ただし、何を試しても、さまざまな認証をカスタマイズして、拒否された例外にアクセスすることはできません。常にデフォルトの 401 ページが表示されます。

私の API は常に json 応答オブジェクトを返すことに同意しているため、これらの例外をキャッチして、json を含む 401 ページを表示する必要があります。

私のsecurty.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth="http://www.springframework.org/schema/security/oauth"
xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.1.xsd
        http://www.springframework.org/schema/security/oauth 
        http://www.springframework.org/schema/security/spring-security-oauth.xsd">


<!-- Authentication beans -->
<bean name="consumerDetailsService" class="com.securitytest.core.services.impl.ConsumerDetailsServiceImpl" />
<bean name="oauthProcessingFilterEntryPoint" class="org.springframework.security.oauth.provider.OAuthProcessingFilterEntryPoint" />
<bean id="oAuthAuthenticationHandler" class="com.securitytest.core.security.CustomOAuthAuthenticationHandler" />

<security:http auto-config="true" use-expressions="true" entry-point-ref="oauthProcessingFilterEntryPoint" >
    <security:intercept-url pattern="/rest/secured/**" access="isAuthenticated()" />
    <security:intercept-url pattern="/rest/unsecured/**" access="permitAll" />
    <security:intercept-url pattern="/rest/**" access="isAuthenticated()" />
    <security:form-login login-page='/login' default-target-url="/home"  authentication-failure-handler-ref="authenticationFailureHandler"/>
    <security:access-denied-handler ref="accessDeniedHandler" />
</security:http>

<bean id="accessDeniedHandler" class="com.securitytest.core.security.CustomoauthAccessDeniedHandler" />
  <!-- this was just a test, it didn't work obviously -->  
<bean id="authenticationFailureHandler"              class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
    <property name="exceptionMappings">
        <props>
            <prop key="org.springframework.security.authentication.BadCredentialsException">/login/badCredentials</prop>
            <prop key="org.springframework.security.authentication.CredentialsExpiredException">/login/credentialsExpired</prop>
            <prop key="org.springframework.security.authentication.LockedException">/login/accountLocked</prop>
            <prop key="org.springframework.security.authentication.DisabledException">/login/accountDisabled</prop>
        </props>
    </property>
</bean>

<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider ref="consumerDetailsService" />
</security:authentication-manager>

<bean id="nonceServices" class="org.springframework.security.oauth.provider.nonce.InMemoryNonceServices" />

<oauth:provider 
        auth-handler-ref="oAuthAuthenticationHandler" 
        consumer-details-service-ref="consumerDetailsService" 
        nonce-services-ref="nonceServices" 
        token-services-ref="tokenServices"
        require10a="true"

        />
<oauth:token-services id="tokenServices" />

私が試したもの

  1. exceptionTranslationFilter を変更します -> ドキュメントでは許可されていません
  2. カスタムの access-denied-handler と authentication-failure-handler-ref を追加します

    <security:http auto-config="true" use-expressions="true" entry-point-ref="oauthProcessingFilterEntryPoint" >
       <security:intercept-url pattern="/rest/secured/**" access="isAuthenticated()" />
       <security:intercept-url pattern="/rest/unsecured/**" access="permitAll" />
       <security:intercept-url pattern="/rest/**" access="isAuthenticated()" />
       <security:form-login login-page='/login' default-target-url="/home"  authentication-failure-handler-ref="authenticationFailureHandler"/>
    
       <security:access-denied-handler ref="accessDeniedHandler" />
    </security:http>
    

    -> これは spring-security/oauth によって露骨に無視されます

  3. EXCEPTION_TRANSLATION_FILTER の後にカスタム フィルターを追加します。

    <security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="myFilter" />
    

    MyFilter は「javax.servlet.Filter」を実装するだけです。-> doFilter に入りますが、それをどうするかわかりません (もしあれば、どの例外がスローされるかわかりません)。

どんな助けでも大歓迎です!!

4

1 に答える 1