Ich versuche Spring Security 3.0.5 in meiner Webanwendung zu verwenden. Grundsätzlich möchte ich einen Webservice haben, der Daten im JSON-Format über HTTP GET
zurückgibt.Behandeln Sie nicht autorisierte Fehlermeldung für die Standardauthentifizierung in Spring Security
Ich habe einen RESTful-Service implementiert, der Daten zurückgibt, wenn die URL http://localhost:8080/webapp/json
angefordert wird. Dies funktioniert mit dem folgenden curl Befehl
> curl http://localhost:8080/webapp/json
{"key":"values"}
Nachdem ich die Standardauthentifizierung mit Feder Sicherheit hinzugefügt, kann ich folgende Befehle verwenden, um die Daten, da jetzt
> 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"}
Die früheren Befehl gibt Standard tomcat Fehlerseite zu bekommen es erfordert Benutzername und Passwort. Meine Frage ist, ob es möglich ist, Zugriff verweigert zu behandeln, so dass es meine eigene Fehlermeldung ausgibt? heißt
> curl http://localhost:8080/webapp/json
{"error":"401", "message":"Username and password required"}
Hier ist meine Feder Sicherheitskonfiguration und AccessDeniedHandler
. Wie Sie sehen können, versuche ich access-denied-handler
hinzuzufügen, die einfach eine Zeichenkette durch die Servlet-Antwort ausgibt, aber es druckt immer noch nicht meine eigene Nachricht in der Befehlszeile.
<?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\"}");
}
}
erstrecken können Sie die Ausgabe von curl -S oder curl -v überprüfen? – Raghuram
Ich habe meine Frage geändert. Es druckte nichts, aber es druckt nicht, was ich will. Die Curl -S und Curl -V beide Standard Tomcat 401 Fehlerseite drucken. -v hat weitere Details der Anfrage/Antwort – gigadot