2017-02-21 17 views
1

Ниже приведен пример конфигурации Spring Spring.Как вернуть 401 для вызова API REST в Spring Security?

Я хочу, чтобы все /api возвращали код HTTP 401 вместо перенаправления 302 на страницу входа.

Также я хочу сохранить функцию перенаправления для старых веб-страниц.

<security:http auto-config='true' use-expressions="true" > 
    <security:intercept-url pattern="/api*" access="hasRole('USER')" /> 
    <security:intercept-url pattern="/oldweb*" access="hasRole('USER')" /> 

    <security:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/home"/>  
</security:http> 

ответ

1

Необходимо иметь пользовательскую точку входа для аутентификации.

public class CustomEntryPoint extends LoginUrlAuthenticationEntryPoint { 

    private static final String XML_HTTP_REQUEST = "XMLHttpRequest"; 
    private static final String X_REQUESTED_WITH = "X-Requested-With"; 

    public CustomEntryPoint(String loginFormUrl) { 
     super(loginFormUrl); 
    } 

    @Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) 
      throws IOException, ServletException { 
     if (XML_HTTP_REQUEST.equals(request.getHeader(X_REQUESTED_WITH))) { 
      response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
     } else { 
      super.commence(request, response, exception); 
     } 
    }  
} 

Наконец изменить конфиг к этому:

<security:http auto-config='true' use-expressions="true" entry-point-ref="customEntryPoint"> 
    <security:intercept-url pattern="/api*" access="hasRole('USER')" /> 
    <security:intercept-url pattern="/oldweb*" access="hasRole('USER')" /> 

    <security:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/home"/> 

    <beans:bean id="customEntryPoint" class="CustomEntryPoint"> 
     <beans:constructor-arg value="/login"/> 
    </beans:bean>  
</security:http> 
1

Я пришел к более простым решением. В Spring Boot и Java config вам просто нужно зарегистрировать дополнительную точку входа в дополнение к стандартной по умолчанию. И поскольку все ваши службы отдыха находятся в пространстве имен «/ api», вы можете использовать AntPathRequestMatcher("/api/**") для соответствия требуемым запросам.

Таким образом, окончательное решение:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http.exceptionHandling() 
        //Actually Spring already configures default AuthenticationEntryPoint - LoginUrlAuthenticationEntryPoint 
        //This one is REST-specific addition to default one, that is based on PathRequest 
        .defaultAuthenticationEntryPointFor(getRestAuthenticationEntryPoint(), new AntPathRequestMatcher("/api/**")); 
    } 

    private AuthenticationEntryPoint getRestAuthenticationEntryPoint() { 
     return new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED); 
    } 
}