REST 控制器的 Spring 安全性

Posted

技术标签:

【中文标题】REST 控制器的 Spring 安全性【英文标题】:Spring security for REST controllers 【发布时间】:2015-07-02 22:22:19 【问题描述】:

我正在为我的 REST 控制器和文档使用 Spring MVC 和 Spring security。我想保护三个不同的路径:

"/api/**" "/api-docs" “/api-documentation”

显然,此代码仅适用于最后一个:“/api-documentation”。我也尝试过 antMatchers("/api/**","/api-docs","/api-documentation") 但我不知道如何正确配置它。有什么想法吗?

http
    .csrf().disable()
    .exceptionHandling().authenticationEntryPoint(entryPoint())
    .and()                  
    .antMatcher("/api/**")            
    .antMatcher("/api-docs") 
    .antMatcher("/api-documentation") 
    .authorizeRequests()
    .anyRequest().hasRole("REST")
    .and()
    .httpBasic();

【问题讨论】:

【参考方案1】:

这里有一些路径匹配建议。

"/api/**" 将匹配 /api/x/y 等所有方法。

"/api-docs" 只会匹配 /api-docs。同样/api-documentation

如果添加"/api-docs/*",它将映射/api-docs/x

这里是some useful resources 蚂蚁图案。

因此类似于,

http
.csrf().disable()
.exceptionHandling().authenticationEntryPoint(entryPoint())
.and()                  
.antMatchers("/api/**","/api-docs","/api-documentation")
.authorizeRequests()
.anyRequest().hasRole("REST")
.and()
.httpBasic();

必须根据您的路径规范要求工作。

【讨论】:

谢谢,但 .antMatcher("/api/**","/api-docs","/api-documentation") 是无效操作。 嗨@maleenc,我想这不是语法问题。问题是我不能把这个操作放在那里。 (antMatchers)。谢谢,我会用这个:.antMatcher("/api*")【参考方案2】:

对于这种情况,只需将 antmatcher 更改为 .antMatcher("/api*") 删除其他两个。

【讨论】:

【参考方案3】:

你必须指定谁可以访问指定的路径:

.antMatchers("/api/**").permitAll() 
.antMatchers("/api-docs").hasRole("ADMIN")

【讨论】:

谢谢,但这是我的问题。只有这三个路径需要使用角色“REST”进行身份验证 会说你需要对每个请求进行身份验证 anyRequest().authenticated() 并添加尝试为每个路径添加hasRole。

以上是关于REST 控制器的 Spring 安全性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot Rest api 中创建安全登录控制器

使用spring-boot对rest服务进行访问控制

Angular 2 + CORS + 带有 Spring Security 的 Spring Boot Rest Controller

使用 Spring Security 保护 REST 端点

我们能否根据 Mediatype 加载不同的安全配置,即一种 REST 和一种用于 Web?

如何使 REST 控制器以环境为条件?