处理Spring Security中基本身份validation的未经授权的错误消息
我试图在我的Web应用程序中使用Spring Security 3.0.5。 基本上,我想要一个通过HTTP GET
以json格式返回数据的Web服务。
我已经实现了一个RESTful服务,它在请求url http://localhost:8080/webapp/json
时返回数据。 使用以下curl命令可以正常工作
> curl http://localhost:8080/webapp/json {"key":"values"}
使用spring security添加基本身份validation后,我可以使用以下命令获取数据
> curl http://localhost:8080/webapp/json 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
。 正如您所看到的,我正在尝试添加access-denied-handler
,它只是通过servlet响应打印出一个字符串,但它仍然不会在命令行上打印我自己的消息。
...
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\"}"); } }
我已经解决了我的问题所以我想我应该在这里分享。 此配置允许服务器根据请求软件以不同方式发送错误消息。 如果请求来自Web浏览器,它将检查User-Agent
标头并在必要时重定向到表单登录。 如果请求来自(例如) curl
,则在身份validation失败时将打印出纯文本错误消息。
...
PlainTextBasicAuthenticationEntryPoint
通过扩展org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint
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("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\""); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); PrintWriter writer = response.getWriter(); writer.println("HTTP Status " + HttpServletResponse.SC_UNAUTHORIZED + " - " + authException.getMessage()); } }
我想知道它是否曾经用于AccessDeniedHandler。 是因为身份validation还是授权而出错? 是否为两种方案调用AccessDeniedHandeler? 我现在正在解决这个问题。