3

春のセキュリティを備えたOAuth2サーバーをセットアップしました。リソースを保護せずに、このOAuthサーバーをSpringセキュリティで使用するクライアントアプリケーションを作成したいと思います。つまり、SpringSecurity3.1を使用してクライアント側からoauth2を実行したいだけです。次の構成を作成しましたが、oauth2サーバーの承認ページにリダイレクトする前に資格情報を要求します。しかし、クライアント側から資格情報を要求する前に、ユーザーをoauth2サーバー認証ページにリダイレクトしたいと思います。次の構成を使用しています

<http auto-config='true' xmlns="http://www.springframework.org/schema/security">
    <intercept-url pattern="/product/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <custom-filter ref="oauth2ClientFilter" after="EXCEPTION_TRANSLATION_FILTER" />
</http>

<authentication-manager xmlns="http://www.springframework.org/schema/security">
    <authentication-provider>
        <user-service>
            <user name="jimi" password="jimi" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

<!--apply the oauth client context -->
<oauth:client id="oauth2ClientFilter" />


<oauth:resource id="fooClient" type="authorization_code"
    client-id="foo" client-secret="secret" access-token-uri="${accessTokenUri}"
    user-authorization-uri="${userAuthorizationUri}" scope="read" />


 <bean id="dService" class="com.abc.service.DServiceImpl">
    <property name="dURL" value="${dURL}"></property>
    <property name="dRestTemplate">
        <oauth:rest-template resource="fooClient" />
    </property>

 </bean>

だから私は/producturlがoauth2サーバーにアクセスする必要があるだけです。残りのURLマッピングは、これがなくても機能するはずです。また、ユーザーはクライアントに対して匿名である必要があります(クライアント側からのログインを表示する必要はありません)。

しかし、アプリケーション「http:// localhost / client-sample / product / 1」を実行すると、「http:// localhost / client-sample/spring_security_login」と表示されます。しかし、私はユーザーがoaut2サーバーページにリダイレクトする必要があります。

4

1 に答える 1

12

Spring セキュリティは、匿名ユーザーがアクセス トークンを取得するのを防ぎます。ただし、アプリケーションでこの機能が引き続き必要な場合は、org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails クラスを拡張し、isClientOnly() メソッドをオーバーライドする必要があります。

import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails;

public class ExtendedBaseOAuth2ProtectedResourceDetails extends
    AuthorizationCodeResourceDetails {

public boolean isClientOnly() {
    return true;
}
}

デフォルトでは、このメソッドは false を返します。したがって、このメソッドをオーバーライドして true を返す必要があります。次に、root-context.xml ファイルで、oaut2 リソースを次のように定義する必要があります。

<bean id="fooClient" class="com.abc.service.ExtendedBaseOAuth2ProtectedResourceDetails">
  <property name="clientId" value="foo"></property>
  <property name="clientSecret" value="secret"></property>
  <property name="accessTokenUri" value="${accessTokenUri}"></property>
  <property name="userAuthorizationUri" value="${userAuthorizationUri}"></property>
  <property name="scope" value="#{{'read','write'}}">   </property>
</bean>

<bean id="dService" class="com.abc.service.DServiceImpl">
  <property name="dURL" value="${dURL}"></property>
  <property name="dRestTemplate">
      <oauth:rest-template resource="fooClient" />
  </property>
</bean>

これにより、ユーザーを oauth2 プロバイダーの承認ページにリダイレクトする前に、クライアント側で承認を求めることはありません。

于 2012-11-05T07:45:37.143 に答える