我们使用Spring Security OAuth2保护我们的REST服务(用于服务器到服务器的通信,无需用户参与).但是,当尝试在浏览器中访问受保护资源时,它将显示:
<oauth>
<error_description>
An Authentication object was not found in the SecurityContext
</error_description>
<error>unauthorized</error>
</oauth>
Run Code Online (Sandbox Code Playgroud)
我们希望这是我们自己选择的自定义页面.有办法吗?
设置访问被拒绝页面将不起作用.首先,它需要定义我们没有的登录页面,因为这是一个纯粹的服务器到服务器通信.对于另一个,这个属性据说自从Spring 3.0以后就被弃用了.
无论如何..调试我的方式进入OAuth错误处理.并且发现响应似乎以某种方式通过我在错误页面上看到的信息得到了丰富.显然根本没有完成页面渲染,所以看起来没有要替换的错误页面..?!
至少我们想要隐藏我们使用OAuth的事实,如果我们不能拥有一个"真正的"页面,只显示一个基本的"拒绝"文本.所以也许我将不得不扩展spring安全处理程序或添加一个自定义过滤器修改响应?!
也许重定向到我们的错误页面?
谢谢!
编辑
在使用Spring的基本认证时,我遇到了与HTTP响应头"Access-Control-Allow-Origin"相关的问题.当我手动验证时,如下面的代码(我正在使用REST):
@RequestMapping(value = "/login", method = RequestMethod.POST, consumes = "application/json")
@ResponseStatus(value = HttpStatus.OK)
public void login(@RequestBody String body, HttpServletResponse response)
throws IOException {
try {
User user = gson.fromJson(body, User.class);
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
usuario.getUsername(), usuario.getPassword());
authenticationManager.authenticate(token);
} catch (BadCredentialsException e) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,我收到以下HTTP响应:
HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
Content-Type: text/html;charset=utf-8
Content-Length: 951
Date: Fri, 17 May 2013 19:14:36 GMT
Run Code Online (Sandbox Code Playgroud)
如您所见,响应中存在"Access-Control-Allow-Origin".这里一切都很好.我可以在我的ajax调用中捕获401错误.
但是,当自动执行身份验证时,如下面的代码:
@RequestMapping(value = "/name", method = …Run Code Online (Sandbox Code Playgroud)