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) を使用して保護されています。
すべてが期待どおりに機能し、保護が機能します。ConsumerDetailsServiceImpl (ConsumerDetailsService、UserDetailsService、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" />
私が試したもの
- exceptionTranslationFilter を変更します -> ドキュメントでは許可されていません
カスタムの 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 によって露骨に無視されます
EXCEPTION_TRANSLATION_FILTER の後にカスタム フィルターを追加します。
<security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="myFilter" />
MyFilter は「javax.servlet.Filter」を実装するだけです。-> doFilter に入りますが、それをどうするかわかりません (もしあれば、どの例外がスローされるかわかりません)。
どんな助けでも大歓迎です!!