I have written a HTML 5 application that uses AngularJS and interfaces with a Java REST backend running on Tomcat. I use Spring Security to handle login and security.
W
I finally found the solution for this. As I mentioned in my update the reason is, that the response contains the WWW-Authenticate
header field. My solution was then to change the configuration of spring security to return a different header:
WWW-Authenticate: FormBased
To do this I had to implement the AuthenticaitonEntryPoint
interface and manually set the header and status code in the response:
@Component( "restAuthenticationEntryPoint" )
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence( HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException ) throws IOException {
response.setHeader("WWW-Authenticate", "FormBased");
response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
}
}
then I changed the configuration of spring-security and set the entry-point-ref
to point to the new class:
<http pattern="/rest/**" create-session="never" entry-point-ref="restAuthenticationEntryPoint">
<intercept-url pattern="/rest/**" access="ROLE_USER" />
<http-basic />
<session-management />
</http>
If you want to avoid changing the server and make it return WWW-Authenticate
header for all other callers, you can change your client to send its request with X-Requested-With
header with XMLHttpRequest
value.
By default, Spring Security will not to send WWW-Authenticate
for such requests. (see Spring source)