在 spring 安全标签中启用 CORS
Posted
技术标签:
【中文标题】在 spring 安全标签中启用 CORS【英文标题】:Enabling CORS in spring security label 【发布时间】:2018-11-08 09:55:14 【问题描述】:如何在 Spring Security 标签中启用 CORS,即在令牌 url 中。我正在使用 spring security 3.1 和 spring mvc 4.3.12。我已成功生成一个令牌以保护 API,但无法在令牌 url 中启用 CORS
。
我已使用以下代码生成访问令牌
spring-security.xml
<http pattern="/oauth/token" create-session="stateless"
authentication-manager-ref="clientAuthenticationManager"
xmlns="http://www.springframework.org/schema/security">
<intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" />
<anonymous enabled="false" />
<http-basic entry-point-ref="clientAuthenticationEntryPoint" />
<!-- include this only if you need to authenticate clients via request
parameters -->
<custom-filter ref="clientCredentialsTokenEndpointFilter"
after="BASIC_AUTH_FILTER" />
<access-denied-handler ref="oauthAccessDeniedHandler" />
</http>
这就是我启用 CORS 但不起作用的方式
dispatcher-servlet.xml
<mvc:cors>
<mvc:mapping path="/oauth/token" allowed-origins="http://localhost:4200"
allowed-methods="GET" allowed-headers="Access-Control-Allow-Origin" />
</mvc:cors>
这是我得到的错误
login:1 加载失败 http://localhost:8080/M.S.-Handloom-Fabrics/oauth/token?grant_type=password&client_id=restapp&client_secret=restapp&username=nishan&password=nishan: 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 使用权。响应的 HTTP 状态代码为 400。
【问题讨论】:
【参考方案1】:对于此错误,您必须创建如下所示的新类。 private String corsFilter="*";
当你提供 * 它将允许一切。希望对你有所帮助。
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter
private String corsFilter="*";
public CorsFilter()
@Override
public void doFilter(final ServletRequest req, final ServletResponse res,
final FilterChain chain) throws IOException, ServletException
final HttpServletResponse response = (HttpServletResponse) res;
final HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", corsFilter);
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, PUT, OPTIONS, PATCH ,DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", " Content-Type, Authorization");
if ("OPTIONS".equalsIgnoreCase(request.getMethod()))
response.setStatus(HttpServletResponse.SC_OK);
else
chain.doFilter(req, res);
@Override
public void init(final FilterConfig filterConfig)
@Override
public void destroy()
【讨论】:
Filter
类需要导入哪个类
导入 javax.servlet.Filter;。如果我的回答有帮助,请接受此回答
我不能使用 XML @jai 做到这一点以上是关于在 spring 安全标签中启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章
使用spring boot(安全)和keycloak启用角色身份验证?
如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法
启用具有 JWT 安全性的 Spring Boot 2.0 执行器端点