ブラウザでログインダイアログをスローするRESTAPIでも同じ問題が発生しました。あなたが言ったように、ブラウザが応答ヘッダーを次のように見るとき
WWW-認証:Basic realm = "Spring Security Application
基本認証ダイアログが表示されます。RESTAPIベースのログインの場合、これは理想的ではありません。これが私がそれをした方法です。カスタム認証エントリポイントを定義し、
最初にヘッダーを「FormBased」として設定します
response.setHeader( "WWW-Authenticate"、 "FormBased");
以下のapplication-context.xml構成
<security:http create-session="never" entry-point-ref="authenticationEntryPoint" authentication-manager-ref="authenticationManager">
<security:custom-filter ref="customRestFilter" position="BASIC_AUTH_FILTER" />
<security:intercept-url pattern="/api/**" access="ROLE_USER" />
</security:http>
<bean id="authenticationEntryPoint" class="com.tito.demo.workflow.security.RestAuthenticationEntryPoint">
</bean>
以下のカスタムエントリポイントクラス。
@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
private static Logger logger = Logger.getLogger(RestAuthenticationEntryPoint.class);
public void commence( HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException ) throws IOException {
logger.debug("<--- Inside authentication entry point --->");
// this is very important for a REST based API login.
// WWW-Authenticate header should be set as FormBased , else browser will show login dialog with realm
response.setHeader("WWW-Authenticate", "FormBased");
response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
}
}
注:私はスプリング3.2.5を使用しました。リリース
これで、POSTMANなどのRESTクライアントから残りのAPIがヒットすると、サーバーは401Unauthorizedを返します。