自定义SpringSecurity OAuth 2错误输出(未经授权)

我们使用Spring Security OAuth2来保护我们的REST服务(用于服务器到服务器之间的通信,无需用户参与)。 但是,当试图在浏览器中访问受保护资源时,它将显示:

  An Authentication object was not found in the SecurityContext  unauthorized  

我们希望这是我们自己选择的自定义页面。 有办法吗?

设置访问被拒绝页面是行不通的。 首先,它需要定义我们没有的登录页面,因为这是一个纯粹的服务器到服务器通信。 对于另一个,这个属性据说自从Spring 3.0以后就被弃用了。

无论如何..调试我的方式进入OAutherror handling。 并且发现响应似乎以某种方式通过我在错误页面上看到的信息得到了丰富。 显然没有完成任何页面渲染,所以看起来没有要替换的错误页面..?!

至少我们想要隐藏我们使用OAuth的事实,如果我们不能拥有“真正的”页面,只显示一个基本的“拒绝”文本。所以也许我将不得不扩展spring安全处理程序或添加一个自定义filter修改响应?!

也许重定向到我们的错误页面?

谢谢!

编辑

对于我们当前的设置,请在此查看我的其他问题

我不得不删除oauth细节,我的解决方案是实现我自己的OAuth2ExceptionRenderer

 package org.some.nice.code; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.ResponseEntity; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.security.oauth2.provider.error.OAuth2ExceptionRenderer; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.ServletWebRequest; public class HeaderOnlyOAuth2ExceptionRenderer implements OAuth2ExceptionRenderer { private final Log logger = LogFactory .getLog(MyOAuth2ExceptionRenderer.class); public void handleHttpEntityResponse(HttpEntity responseEntity, ServletWebRequest webRequest) throws Exception { if (responseEntity == null) { return; } HttpInputMessage inputMessage = createHttpInputMessage(webRequest); HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest); logger.info("filtering headers only..."); if (responseEntity instanceof ResponseEntity && outputMessage instanceof ServerHttpResponse) { ((ServerHttpResponse) outputMessage) .setStatusCode(((ResponseEntity) responseEntity) .getStatusCode()); } HttpHeaders entityHeaders = responseEntity.getHeaders(); if (!entityHeaders.isEmpty()) { outputMessage.getHeaders().putAll(entityHeaders); } } private HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) throws Exception { HttpServletRequest servletRequest = webRequest .getNativeRequest(HttpServletRequest.class); return new ServletServerHttpRequest(servletRequest); } private HttpOutputMessage createHttpOutputMessage( NativeWebRequest webRequest) throws Exception { HttpServletResponse servletResponse = (HttpServletResponse) webRequest .getNativeResponse(); return new ServletServerHttpResponse(servletResponse); } } 

然后你必须在你的spring环境中引用它

               

希望能帮助到你。