Spring 安全 REST API
Posted
技术标签:
【中文标题】Spring 安全 REST API【英文标题】:Spring security REST API 【发布时间】:2014-04-27 10:16:15 【问题描述】:我正在使用带有 grails 和 AngularJS 的 Spring Security REST Api。我用邮递员尝试了 url 请求,它工作正常。它使用使用的 x-auth-token 返回结果。但是我也尝试过使用 AngularJs,但它并没有进一步提出 OPTION 请求。
在这里的第一张图片中,它显示我的请求仅被处理到 OPTION 请求。 在第二张图片中,显示了我在 POSTMAN 中尝试过的内容。它给出了结果并且与 x-auth-token 一起工作得很好。 在第三张图片中,我集成了 spring 安全插件,如下所示。它适用于“api/login”,但进一步失败。 第 4 张图片显示了 OPTION 请求的详细响应,然后它无法进一步。
我已经编写了如下的 grunt connect 方法
connect:
options:
port: 9000,
// Change this to '0.0.0.0' to access the server from outside.
hostname: 'localhost',
livereload: 35729
,
proxies: [
context: '/crm/api',
host: 'localhost',
port: 8080
],
livereload:
options:
open: true,
base: [
'.tmp',
'<%= yeoman.app %>'
]
,
test:
options:
port: 9001,
base: [
'.tmp',
'test',
'<%= yeoman.app %>'
]
,
dist:
options:
base: '<%= yeoman.dist %>'
我还是有同样的错误。
【问题讨论】:
【参考方案1】:正如agerco 所解释的,问题是跨域问题。
有关解决方案,请参阅此 Spring 指南:Enabling Cross Origin Requests for a RESTful Web Service。
如上述指南所述,您需要在应用程序上下文中添加一个 Filter
bean。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class SimpleCORSFilter implements Filter
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "localhost:9000"); // Client URL
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
public void init(FilterConfig filterConfig)
public void destroy()
【讨论】:
您好我有同样的问题,我在客户端设置了 grunt-connect-proxy 并在服务器端添加了过滤器。但它不起作用......我如何在spring mvc项目中检查“启用跨源请求”?【参考方案2】:这是一个跨域问题。
您的网页位于localhost:9000
,您的后端为localhost:8080
。从技术上讲,它们是 2 个不同的域,因此您需要启用跨源请求,或者使用代理将请求转发到端口 8080
。
看起来您正在使用 grunt,所以我建议您设置代理。我使用grunt-connect-proxy 设置转发到我的后端端口:
connect:
options:
port: 9000,
hostname: 'localhost',
livereload: 35729
,
proxies: [
context: '/crm/api',
host: 'localhost',
port: 8080
]
【讨论】:
嘿,正如你所说,我添加了代理,并使用我在 grunt 文件中使用的连接方法编辑了我的问题。我仍然有同样的错误。你能看看它到底有什么问题吗? 更改您的 ajax 请求 url 以使用与您的网页相同的域,您可以使用不带域的路径:/crm/api/language/index.json
,代理会将其转发到正确的端口。因此,当您查看网络选项卡时,它应该点击 localhost:9000/crm/api/language/index.json
以上是关于Spring 安全 REST API的主要内容,如果未能解决你的问题,请参考以下文章
关于基于 Spring 安全 URL 的安全性的说明 [重复]
如何使用 Rest 和 Spring 安全性通过 ldap 登录 Angular?