Spring @RestController用于匿名和授权用户的单一方法

时间:2017-01-28 13:24:56

标签: spring spring-mvc spring-security spring-security-oauth2 spring-restcontroller

我有一个以下的Spring RestController:

@RestController
@RequestMapping("/v1.0/tenants")
public class TenantController {

    @Autowired
    private TenantService tenantService;

    @RequestMapping(value = "/{tenantId}", method = RequestMethod.GET)
    public TenantResponse findTenantById(@PathVariable @NotNull @DecimalMin("0") Long tenantId) {
        Tenant tenant = tenantService.findTenantById(tenantId);
        return new TenantResponse(tenant);
    }

}
匿名用户和授权用户应该访问

findTenantById方法。如果匿名用户SecurityContextHolder.getContext().getAuthentication()必须返回NULL或AnonymousAuthenticationToken,但如果是授权的 - 身份验证对象。

在我的应用程序中,我使用OAuth2 + JWT令牌实现了安全模型。

这是我的配置:

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http                
            .antMatcher("/v1.0/**").authorizeRequests()
            .antMatchers("/v1.0/tenants/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(STATELESS); 
        // @formatter:on
    }

此外,对于安全端点,我在需要的地方应用@PreAuthorize注释,但在findTenantById的情况下不应用,因为正如我之前所说的,我需要授予匿名和授权访问此端点的权限用户。在端点业务逻辑内部,我将决定谁能够根据不同的条件继续进行。

现在,即使我为此端点提供了accessToken,我也无法从SecurityContextHolder.getContext().getAuthentication()获取经过身份验证的用户对象。

如何配置此端点以便以上述方式工作?

1 个答案:

答案 0 :(得分:2)

我想我找到了一个解决方案 - 我用以下方法注释了我的方法:

@PreAuthorize("isAnonymous() or isFullyAuthenticated()")

如果有更好的解决方案,请告诉我。