我有以下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
为此端点提供了我,也无法从获得身份验证的User对象SecurityContextHolder.getContext().getAuthentication()
。
如何配置此端点才能以上述方式工作?
我想我已经找到了解决方案-我用以下方法注释了我的方法:
@PreAuthorize("isAnonymous() or isFullyAuthenticated()")
请让我知道是否有更好的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句