Spring-Boot向REST服务

时间:2016-10-31 12:54:02

标签: java spring rest spring-security spring-boot

我的任务是构建一个REST服务,该服务需要对一些操作进行身份验证,同时允许其他人使用匿名用户。

例如:

| Path         | Requires authentication |
| /add         | YES                     |
| /{name}      | NO                      |
| /report/{id} | YES                     |

但是我在设置弹簧安全性方面遇到了问题。

如果我覆盖WebSecurityConfigurerAdapter configure这样的功能:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()                
            .and()
            .httpBasic()
            .and()
            .authorizeRequests()                
            //.antMatchers(HttpMethod.GET, "/{name}").permitAll() // I can't really specify a dynamic url here, can i?
            .anyRequest().authenticated();                
}

使用此配置,我调用的任何操作将首先显示标准浏览器基本身份验证弹出窗体。这就是我想要的,除了我不想在动态网址/{name}操作上这样做。

所以我尝试删除.anyRequest().authenticated()并激活@PreAuthorize@PostAuthorize注释 @EnableGlobalMethodSecurity(proxyTargetClass = true, prePostEnabled = true) 并向控制器操作添加注释,如下所示:

| Path         | Annotation                         |
| /add         | @PreAuthorize("isAuthenticated()") |
| /{name}      | @PreAuthorize("permitAll()")       |
| /report/{id} | @PreAuthorize("isAuthenticated()") |

使用此/{name}操作可以按预期允许匿名用户,但/add/report/{id}操作现在只返回"访问被拒绝"状态为500,而不是强制基本身份验证。

如何在选择控制器方法上强制进行基本身份验证,同时允许匿名访问其他方法?

1 个答案:

答案 0 :(得分:1)

指定每个网址的配置应该可以解决问题:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
       .csrf().disable()                
       .and()
       .httpBasic()
       .and()
       .authorizeRequests()                
       .antMatchers(HttpMethod.GET, "/*").permitAll()
       .antMatchers(HttpMethod.GET, "/add").authenticated()
       .antMatchers(HttpMethod.GET, "/report/*").authenticated()
       .anyRequest().authenticated();                
}