1

У меня есть следующий весенний 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

Разрешить все должно разрешать всем пользователям вызывать метод контроллера. Если вы когда-либо называете 'SecurityContextHolder.getContext(). GetAuthentication()' в коде, вы, скорее всего, делаете что-то неправильно. Если вам нужно знать, кто является пользователем, вы должны просто включить 'Authentication auth' в метод контроллера, а Spring будет вводить его для вас, как и для' Model', 'Session' и нескольких других типов. –

ответ

2

Я думаю, что я нашел решение - я аннотированный мой метод с:

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

Пожалуйста, дайте мне знать, если есть какие-либо более эффективные решения.

+1

Да, ваши права. Я нашел проблему в своей бизнес-логике, которая была причиной этой проблемы. Теперь все отлично работает с 'allowAll'. Благодарю. – alexanoid