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的主要内容,如果未能解决你的问题,请参考以下文章

REST 控制器的 Spring 安全性

关于基于 Spring 安全 URL 的安全性的说明 [重复]

如何使用 Rest 和 Spring 安全性通过 ldap 登录 Angular?

Karaf 容器、Rest WS 和 Spring 安全性

如何在Spring启动应用程序中进行REST调用而不在Spring安全性中禁用CSRF保护?

用于内部 REST 通信的 OAuth + spring 安全性