Обработка сообщения об несанкционированной ошибке для базовой аутентификации в Spring Security

Я пытаюсь использовать Spring Security 3.0.5 в своем веб-приложении. По сути, я хочу иметь веб-службу, которая возвращает данные в формате json через HTTP GET .

Я реализовал службу RESTful, которая возвращает данные, когда URL http: // localhost: 8080 / webapp / json запрошен. Это отлично работает со следующей командой curl

> curl http://localhost:8080/webapp/json
{"key":"values"}

После того, как я добавил базовую аутентификацию с использованием Spring Security, Я могу использовать следующие команды для получения данных

> curl  http://localhost:8080/webapp/json
<html><head><title>Apache Tomcat/6.0.29 - Error report .....
> curl -u username:password http://localhost:8080/webapp/json
{"key":"values"}

Первая команда возвращает стандартную страницу ошибки tomcat, так как теперь она требует имени пользователя и пароля. Мой вопрос: можно ли обработать отказ в доступе таким образом, чтобы выводить мое собственное сообщение об ошибке? т.е.

> curl  http://localhost:8080/webapp/json
{"error":"401", "message":"Username and password required"}

Вот моя конфигурация безопасности Spring и AccessDeniedHandler . Как видите, я пытаюсь добавить обработчик отказа в доступе , который просто выводит строку из ответа сервлета, но при этом не выводит мое собственное сообщение в командной строке.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
       xmlns:beans="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">
    <global-method-security secured-annotations="enabled"/>

    <beans:bean name="access-denied" class="webapp.error.JSONAccessDeniedHandler"></beans:bean>

    <http auto-config="true">
        <access-denied-handler ref="access-denied"/>
        <intercept-url pattern="/json" access="ROLE_USER,ROLE_ADMIN"  />
        <http-basic />
    </http>

    <authentication-manager>
        <authentication-provider>
            <password-encoder hash="md5"/>
            <user-service>
            ...
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

AccessDeniedHandler.java

package webapp.error;

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.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;

public class JSONAccessDeniedHandler implements AccessDeniedHandler  {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        PrintWriter writer = response.getWriter();
        writer.print("{\"error\":\"401\", \"message\":\"Username and password required\"}");
    }

}
14
задан Xtreme Biker reinstate Monica 25 March 2014 в 15:06
поделиться