java - Spring Security 条件基本身份验证

标签 java rest api spring-security authorization

我有一个端点,我希望允许访问而无需基本身份验证。其端点如下:

  @ApiOperation(value = "Get a image by id", response = ResponseEntity.class)
@RequestMapping(value = "/{id}", method = RequestMethod.GET)   //sets the mapping url and the HTTP method
public void getById(@PathVariable("id") Long id, HttpServletResponse response) throws NotFoundException {
    ImageView view;
    try {
        view = manager.get(id);
        ByteArrayInputStream in = new ByteArrayInputStream(view.getImageData());
        response.setContentType(MediaType.parseMediaType(view.getImageMimeType()).toString());
        IOUtils.copy(in, response.getOutputStream());
    } catch (NotFoundException e) {
        response.setStatus(204); //HttpStatus.NO_CONTENT);
        return;
    } catch (IOException ioe) {
        response.setStatus(400);//HttpState.BAD_REQUEST
        return;
    }
}

我读过其他几篇关于有类似问题的人的堆栈溢出帖子,并发现覆盖安全配置是有效的。以下是我通过阅读几篇文章而设计的解决方案。但是,我仍然遇到问题,并在未经身份验证的情况下请求资源时收到 401。另外,完整的路由将是“{host}/service/v1/images/{id}”

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()   //disable csrf being needed for header in a request
            .authorizeRequests()    //authorize the following request based on following set rules
            .antMatchers(HttpMethod.OPTIONS, "**").permitAll() //allow any user to access this when OPTIONS
            .antMatchers(HttpMethod.GET,"**/service/v1/images/**").permitAll() //allows GETS for given route permitted to all users
            .anyRequest().authenticated() //catch all: this implies that if nothing matches the above two patterns, then require authentication
            .and().httpBasic(); //utilize http basic for authentication

}

任何关于我可能做错了什么以及如何纠正这个问题的见解将不胜感激。

最佳答案

要忽略特定 URL 的安全性,请执行以下操作:

除了你的

@Override
protected void configure(HttpSecurity http) throws Exception { ... }

您还需要重写下一个方法:

@Override
public void configure(WebSecurity web) throws Exception { ... }

在该方法中,您可以编写类似以下内容以忽略特定 URL 的安全性:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**", "/js/**", 
            "/app/controllers/**", "/app/partials/**", "/app/*",
            "/", "/index.html", "/favicon.ico");
}

上面的示例将禁用指定的 ant 匹配器的安全性。

你可以删除permitAll()

关于java - Spring Security 条件基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43325682/

相关文章:

java - 将 Java 比较器转换为 Scala 排序

javascript - 进入 Spotify 阵列

mysql - Node.js + 无法读取未定义的属性 'query'

http - get 请求中的参数可以有多长?

iphone - 如何验证使用 Facebook 验证用户身份的 Web 服务调用?

php - 调用另一个 laravel 项目的 API

java - 当两者的输出相同时,为什么我的 if/else 语句不匹配?

java - Apache Camel RouteBuilder 配置方法

java - 如何使用Jni将结构从c代码传递到java

rest - 具有日期范围的正确 REST 格式 URL