当前位置: 首页 > 知识库问答 >
问题:

Spring security不允许使用简单匹配器和permitAll访问

璩和璧
2023-03-14

就Spring security而言,它对我来说是全新的。我在网上找到了许多描述如何设置基本安全性的资源,并且能够让HTTPS REST调用在服务器端使用以下配置:

@Configuration
@EnableWebSecurity
@EnableConfigurationProperties(SecurityAuthProperties.class)
public class ServerSecurityConfiguration extends WebSecurityConfigurerAdapter {

  private final SecurityAuthProperties properties;

  @Autowired
  public ServerSecurityConfiguration(SecurityAuthProperties properties) {
    this.properties = properties;
  }

  @Override
  public void configure(HttpSecurity http) throws Exception {
    properties.getEndpoints().forEach((key, value) -> {
      try {
        for (HttpMethod method : value.getMethods()) {
          http.authorizeRequests().antMatchers(method, value.getPath()).permitAll().and()
              .httpBasic().and().csrf().disable();
        }
      } catch (Exception e) {
        throw new SecurityConfigurationException(
            "Problem encountered while setting up endpoint restrictions", e);
      }
    });

    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  }

}
  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/rst/**").permitAll();
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  }

在我看来,这段代码允许访问路径/rst及其下的任何内容,但似乎恰恰相反。我错过了什么?

注意:我要提到的另一件事是,目前没有“用户”身份验证。“客户端”不是基于web的,而是一个单独的Spring Boot服务,它有自己的客户端安全配置。

更新:

@RestController
@RequestMapping("/rst/missionPlanning")
public class MissionPlannerController {

  @Autowired
  private MissionPlanner         service;
  @Autowired
  private ThreadPoolTaskExecutor executor;

  @PostMapping(value = "/planMission", produces = MediaType.APPLICATION_JSON_VALUE)
  public DeferredResult<ResponseEntity<GeneralResponse>> planMission() {
    DeferredResult<ResponseEntity<GeneralResponse>> result = new DeferredResult<>(60000L);
    executor.execute(new Runner(result));
    return result;
  }

  private class Runner implements ITask {

    private DeferredResult<ResponseEntity<GeneralResponse>> result;

    public Runner(DeferredResult<ResponseEntity<GeneralResponse>> result) {
      this.result = result;
    }

    @Override
    public void executeTask() {
      // Invoke service and set result.
      result.setResult(ResponseEntity.ok(service.planMission()));
    }
  }
}
  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().authorizeRequests().antMatchers("/rst/**").permitAll();
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  }

共有1个答案

常永怡
2023-03-14

您设置控制器的方式可能有问题。包含该路径的控制器是否具有@requestmapping(“/rst”)

如果你用你的控制器的样子更新你的帖子会很有帮助。

编辑:看来你的问题是在你必须禁用CSRF时所提出的请求的类型。

您可以在此阅读更多信息:https://docs.spring.io/spring-security/site/docs/3.2.0.ci-snapshot/reference/html/csrf.html#csrf-include-csrf-token

在这里:https://www.baeldung.com/spring-security-csrf

 类似资料:
  • 在调试级别进行日志记录时,我看到了Spring Security的以下反馈: 我试图实现的是有一个可以在任何时候调用的方法,它将发送一个答复,指示请求是否在登录的会话中。

  • 我有一个方法,我想允许匿名和身份验证访问。 我正在使用Spring Security3.2.4和基于java的配置。 在调试级别进行日志记录时,我看到了Spring Security的以下反馈: 我试图实现的是有一个可以在任何时候调用的方法,它将发送一个答复,指示请求是否在登录的会话中。

  • 我正在我的应用程序中实现Spring Security,我想允许所有人使用,我尝试使用 我得到了, 这是我的配置课 这是我的yml配置: 有人可以在这里帮助我吗?

  • 我是不是漏掉了什么?提前感谢!

  • 问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您