2016-01-25 2 views
0

Я пытался заменить некоторые проверки полномочий вручную аннотациями (@Secured и @PreAuthorize). При отладке, почему это не работает, я был удивлен, обнаружив, что второе из этих двух утверждений не удалось в верхней части метода контроллера @RequestMapping.Власти SecurityContext не равны ролям ServletRequest?

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
assert(auth.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_READER"))); // passes 
assert(request.isUserInRole("ROLE_READER")); // fails 

Я предполагаю, что (как я не могу заставить их разрешить что-нибудь) @Secured и hasRole() делают использование последнего поиска?

Являются ли роли, которые не должны автоматически заселяться от властей SecurityContext?

Был ли фильтр, который установил Authentication, предположительно, чтобы добавить роли отдельно?


Edit:

Сократите конфигурации безопасности весны до весны (1.3.0) по умолчанию ботинка, а также фильтр, который устанавливает аутентификацию.

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.addFilterBefore(new JwtAuthenticationFilter(), FilterSecurityInterceptor.class); 
    } 
} 
+0

Опубликуйте свою конфигурацию ... И какую версию безопасности для весны вы используете. –

+0

Я далек от MVCE - конфигурация распространяется по многим классам во многих проектах. Это не вопрос «найти мою ошибку», это вопрос «как это работает». – OrangeDog

+0

Единственное, что нужно - это настройка безопасности и ответ на вопрос о том, какую версию Spring Security вы используете. –

ответ

0

Я предполагаю, что (как я не могу заставить их разрешить что-нибудь) @Secured и hasRole() использовать последний поиск?

Мое предположение было неправильным. Оба используют предоставленные полномочия, но по-разному. :

  • @Secured требует код префикса, поэтому @Secured("ROLE_READER") работает.
  • hasRole не использует префикс, поэтому @PreAuthorize("hasRole('READER')") работает.
  • Оба требуют, чтобы предоставленные полномочия были префиксом, поэтому @Secured("READER") никогда не будет работать.

Префикс может быть сконфигурирован с .

HttpServletRequest.isUserInRole использует совершенно отдельную систему, не связанную с весной. Он не заполняется по умолчанию, и его не нужно. Я полагаю, что добавление SecurityContextHolderAwareRequestFilter к цепочке заселоет его

+0

Предположение о вашем вопросе состояло в том, что у вас была правильная интеграция для Spring Security с помощью API сервлета (вызов 'servletApi' для его настройки). –