У меня есть следующий весенний 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()
.
Как настроить эту конечную точку для того, чтобы работать таким образом, как описано выше?
Разрешить все должно разрешать всем пользователям вызывать метод контроллера. Если вы когда-либо называете 'SecurityContextHolder.getContext(). GetAuthentication()' в коде, вы, скорее всего, делаете что-то неправильно. Если вам нужно знать, кто является пользователем, вы должны просто включить 'Authentication auth' в метод контроллера, а Spring будет вводить его для вас, как и для' Model', 'Session' и нескольких других типов. –