Вот мой сингл конфигурации безопасности для API сделал с SpringBoot:Безопасные методы MVC контроллер с @Secured аннотацию
@Configuration
@EnableWebSecurity
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Autowired
private TokenAuthenticationService tokenAuthenticationService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/static/**").permitAll()
.antMatchers(HttpMethod.POST, "/api/user/registration").permitAll()
.antMatchers(HttpMethod.POST, "/api/user/authentication").permitAll()
.anyRequest().authenticated().and()
.addFilterBefore(new TokenLoginFilter("/api/user/authentication", authenticationManagerBean(), tokenAuthenticationService),
UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new TokenAuthenticationFilter(tokenAuthenticationService),UsernamePasswordAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder());
}
}
Все URL отображаются на пружинный веб MVC контроллеры, и я хотел бы, чтобы вручную указать уровни доступа для контроллеров и их методы, как это:
@RestController
@RequestMapping("/api/resource/")
@Secured("ROLE_ANONYMOUS") //as default role
public class ResourceController {
...
@Secured("ROLE_USER")
some_method...
}
но когда мне выполнить/API/ресурс/* запросы как анонимный пользователь ответов приложения с 403 кодом состояния, но я ожидаю вызова метода. Похоже, что аннотация @Secured не влияет на авторизацию, и все методы контроллера разрешены только для ROLE_USER.
TokenAuthenticationFilter выполняет действие только в том случае, если присутствует токен, поэтому я думаю, что это не влияет.
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) req;
String token = httpServletRequest.getHeader(TokenAuthenticationService.AUTH_HEADER_NAME);
if (token != null) {
try {
SecurityContextHolder.getContext()
.setAuthentication(tokenAuthenticationService.verifyToken(new TokenAuthentication(token)));
} catch (AuthenticationException e) {
((HttpServletResponse) res).setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
}
chain.doFilter(req, res);
}
Update:
Учитывая комментарии ниже этот вопрос я понял, что @Secured аннотаций является частью глобальной концепции метод безопасности, а не в общей части веб-безопасности. Теперь я folowing компромисса:
Использования @Secured аннотации и информация о методе уровня доступа распространяется на классах контроллера, которые могут привести к ситуации diffucult определения уровня доступа метода в fufture с API выращенным.
Храните всю информацию о доступе к методу в одном и том же месте (config), но должны поддерживать равенство значения @RequestMapping с помощью URL-адресов в config.
Какой из них вы считаете лучшим подходом или скажите пожалуйста, если я что-то пропустил?
Это то, что вы указали в конфигурации ... для всех URL-адресов вы должны быть 'authenticated'. –
Итак, как я могу сообщить Spring Security о наблюдении за аннотацией для любого другого метода сопоставления с контроллером? – Aeteros
разрешают все доступ и используют глобальную защиту метода. URL-адреса и аннотации для разных вещей. –