Estoy tratando de usar Spring Security 3.0.5 en mi aplicación web. Básicamente, quiero tener un servicio web que devuelva datos en formato json a través del HTTP GET
.Manejar el mensaje de error no autorizado para la autenticación básica en Spring Security
He implementado un servicio RESTful que devuelve datos cuando se solicita la url http://localhost:8080/webapp/json
. Esto funciona muy bien con el siguiente comando curl
> curl http://localhost:8080/webapp/json
{"key":"values"}
Después añadí autenticación básica mediante la seguridad de la primavera, puedo usar los siguientes comandos para obtener los datos
> 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"}
La página de error Tomcat estándar ex comando devuelve desde ahora requiere nombre de usuario y contraseña. Mi pregunta es si es posible manejar el acceso denegado de tal forma que imprima mi propio mensaje de error. decir
> curl http://localhost:8080/webapp/json
{"error":"401", "message":"Username and password required"}
Aquí está mi configuración de seguridad primavera y AccessDeniedHandler
. Como puede ver, estoy tratando de agregar access-denied-handler
que simplemente imprime una cadena a través de la respuesta de servlet, pero todavía no imprime mi propio mensaje en la línea de comandos.
<?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\"}");
}
}
Se puede comprobar la salida de rizo o -S -v rizo? – Raghuram
He modificado mi pregunta. No estaba imprimiendo nada, pero no imprime lo que quiero. El rizo -S y el rizo -v imprimen la página de error 401 de tomcat estándar. -v tiene más detalles de la solicitud/respuesta – gigadot