Spring Security, REST basic authentication issue

后端 未结 1 1665
猫巷女王i
猫巷女王i 2020-12-24 04:06

I got an issue related to the HTTP response header \"Access-Control-Allow-Origin\" when using basic authetication with Spring. When I authenticate manually, like the code be

相关标签:
1条回答
  • 2020-12-24 04:28

    Just found my own way:

    First of all, I don't really remember why I put this line here, but it was messing up my code:

    <security:http-basic />
    

    Second, this answer show me the path: Handle unauthorized error message for Basic Authentication in Spring Security. I had to create a custom authentication entry point in order to send the Access-Control-Allow-Origin thing.

    So this is my code now:

    <?xml version="1.0" encoding="UTF-8"?>
    <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"
        xsi:schemaLocation="
                  http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                  http://www.springframework.org/schema/security
                  http://www.springframework.org/schema/security/spring-security-3.1.xsd">
    
        <security:http create-session="stateless"
            entry-point-ref="authenticationEntryPoint">
            <security:intercept-url pattern="/api/admin/**" />
            <security:intercept-url pattern="/medico/**" />
            <!-- <security:http-basic />  -->
            <security:custom-filter ref="basicAuthenticationFilter"
                after="BASIC_AUTH_FILTER" />
        </security:http>
    
        <bean id="basicAuthenticationFilter"
            class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
            <property name="authenticationManager" ref="authenticationManager" />
            <property name="authenticationEntryPoint" ref="authenticationEntryPoint" />
        </bean>
    
                <!-- 
        <bean id="authenticationEntryPoint" 
            class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
            <property name="realmName" value="test.com" />
        </bean> -->
    
    
        <bean id="authenticationEntryPoint" 
            class="com.test.util.PlainTextBasicAuthenticationEntryPoint">
            <property name="realmName" value="test.com" />
        </bean> 
    
        <!-- It is responsible for validating the user's credentials -->
        <security:authentication-manager alias="authenticationManager">
    
            <!-- It is responsible for providing credential validation to the AuthenticationManager -->
            <security:authentication-provider>
                <security:password-encoder ref="passwordEncoder" />
    
                <security:jdbc-user-service
                    data-source-ref="mySQLdataSource"
                    users-by-username-query="select username, password, enabled from usuario where username = ?"
                    authorities-by-username-query="select username, papel from autoridade where username = ?" />
    
            </security:authentication-provider>
    
        </security:authentication-manager>
    
        <bean
            class="org.springframework.security.crypto.password.StandardPasswordEncoder"
            id="passwordEncoder" />
    
    </beans>
    
    package com.test.util;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.security.core.AuthenticationException;
    import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
    
    public class PlainTextBasicAuthenticationEntryPoint extends
            BasicAuthenticationEntryPoint {
    
          @Override
            public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
                response.addHeader("Access-Control-Allow-Origin", "null");
                response.addHeader("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\"");
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                PrintWriter writer = response.getWriter();
                writer.println("HTTP Status " + HttpServletResponse.SC_UNAUTHORIZED + " - " + authException.getMessage());
            }
    
    }
    

    My http response now:

    HTTP/1.1 401 Unauthorized
    Server: Apache-Coyote/1.1
    Access-Control-Allow-Origin: null
    WWW-Authenticate: Basic realm="test.com"
    Content-Length: 35
    Date: Mon, 20 May 2013 20:05:03 GMT
    
    HTTP Status 401 - Bad credentials
    

    before the alteration, I got this error message:

    OPTIONS http://localhost:8080/test/customer/name 200 (OK) jquery-1.8.2.min.js:2
    XMLHttpRequest cannot load http://localhost:8080/test/customer/name. Origin null is     not allowed by Access-Control-Allow-Origin. 
    

    and now as expected I get this one:

    OPTIONS http://localhost:8080/test/customer/name 200 (OK) jquery-1.8.2.min.js:2
    POST http://localhost:8080/test/customer/name 401 (Unauthorized) 
    
    0 讨论(0)
提交回复
热议问题