2016-08-22 4 views
1

Я использую последнюю версию Spring Boot + Spring Boot Starter Security для простого прокси-приложения. Цель состоит в том, чтобы запустить приложение с помощью одного маршрута/метода:Изменение конфигурации безопасности Spring в Runtime

@RequestMapping(value = "/api/register", 
    method = RequestMethod.POST, 
    produces = MediaType.APPLICATION_JSON_VALUE) 
@Timed 
public ResponseEntity<?> register(Registration registration) { 

При конфигурации безопасности:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    this.http = http 
     .authorizeRequests() 
     .antMatchers("/api/register").hasAuthority(AuthorityConstants.ADMIN) 
    .and(); 
} 

public HttpSecurity getHttpSecurity() { 
    return http; 
} 

цели приложения будет принимать регистрационные запросы вида:

{ 
    "route":"/api/foo/bar", 
    "proxy_location": "http://back-end-server/path/to/resource", 
    "role": "some-authority" 
} 

И тогда приложение будет добавить /api/foo/bar маршрут с заранее определенным методом, который будет прокси (вперед) будущие запросы на обслуживание серверного.

Я знаю, что это немного тупой, реальный случай использования включает в себя веб-сайты и динамическое создание тем.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу обновить конфигурацию безопасности после завершения SecurityConfigurer.

В примере коды выше я кэширование HttpSecurity объекта, отведенного мои SecurityConfigurer, а затем пытаюсь использовать этот объект снова, чтобы настроить новый маршрут:

@Inject 
private SecurityConfigurer security; 

@RequestMapping(value = "/api/register", 
    method = RequestMethod.POST, 
    produces = MediaType.APPLICATION_JSON_VALUE) 
@Timed 
public ResponseEntity<?> allowGetAccounts(Registration registration) { 
    try { 
     security.getHttpSecurity() 
      .authorizeRequests() 
      .antMatchers(registration.getRoute()).hasAuthority(registration.getRole()); 

     ... 

    } catch (Exception e) { 
     log.error("Updating security failed!", e); 
    } 

    return new ResponseEntity<>(null, HttpStatus.OK); 
} 

Есть ли способ, чтобы обновить конфигурацию безопасности динамически во время выполнения?

Кроме того, если у кого есть какие-либо заметки о динамическом создании тем в разделе веб-камеры, которые тоже будут оценены!

+0

Конечная цель - добавить роль в список полномочий пользователя, исправить? – slambeth

+0

Конечная цель - добавить маршрут к конфигурации безопасности, в основном открыть другой путь для пользователей с определенной ролью. –

+0

Вы действительно получаете исключение, или вы просто не видите каких-либо изменений в безопасности? – slambeth

ответ

0

У вас есть несколько вариантов:

  • использование antchMatcher("/some/path").access("@someBean.hasAccess(authentication)"). Это позволяет в основном использовать любой компонент в контексте приложения для применения необходимой проверки.

  • Использование @PreAuthorize("@someBean.hasAccess(authentication)") на вас RequestMapping аннотированный метод. Такая же идея, как и раньше, но как перехватчик на самой конечной точке.

  • Внесите свой собственный SecurityExpressionHandler и подключите его к http.authorizeRequests().expressionHandler(...).

  • Внесите свой собственный фильтр безопасности, который обрабатывает все, что вам нужно.