6

Это моя весна Загрузочный 1.5.1 Привод application.properties:Spring Пыльники привода Endpoints безопасности не работает с конфигурацией безопасности пользовательских Spring

#Spring Boot Actuator 
management.contextPath: /actuator 
management.security.roles=R_0 

Это мой WebSecurityConfig:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Value("${logout.success.url}") 
    private String logoutSuccessUrl; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     // @formatter:off 
     http.addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class); 

     http 
      .csrf().ignoringAntMatchers("/v1.0/**", "/logout") 
     .and() 
      .authorizeRequests() 

      .antMatchers("/oauth/authorize").authenticated() 
      //Anyone can access the urls 
      .antMatchers("/signin/**").permitAll() 
      .antMatchers("/v1.0/**").permitAll() 
      .antMatchers("/auth/**").permitAll() 
      .antMatchers("/actuator/health").permitAll() 
      .antMatchers("/actuator/**").hasAuthority("R_0") 
      .antMatchers("/login").permitAll() 
      .anyRequest().authenticated() 
     .and() 
      .formLogin() 
       .loginPage("/login") 
       .loginProcessingUrl("/login") 
       .failureUrl("/login?error=true") 
       .usernameParameter("username") 
       .passwordParameter("password") 
       .permitAll() 
      .and() 
       .logout() 
        .logoutUrl("/logout") 
        .logoutSuccessUrl(logoutSuccessUrl) 
        .permitAll(); 
     // @formatter:on 
    } 

    /** 
    * Configures the authentication manager bean which processes authentication requests. 
    */ 
    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); 
    } 

    @Override 
    @Bean 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

} 

Сейчас я 'успешно удается войти в мое приложение с нужным пользователем, у которого есть R_0, но когда я пытаюсь получить доступ, например,

http://localhost:8080/api/actuator/beans 

я получаю следующее сообщение об ошибке:

There was an unexpected error (type=Forbidden, status=403). 
Access is denied. User must have one of the these roles: R_0 

Как правильно настроить Spring загрузки привода для того, чтобы быть в курсе о правильном Authentication?

Сейчас для того, чтобы получить его, я работаю должен сделать следующий трюк:

management.security.enabled=false 

.antMatchers("/actuator/health").permitAll() 
.antMatchers("/actuator/**").hasAuthority("R_0") 

ли шанс настроить привода в правильном направлении?

ОБНОВЛЕНО

Я использую UserDetailsService.UserDetails.Authorities

public Collection<? extends GrantedAuthority> getAuthorities() { 
     String[] authorities = permissions.stream().map(p -> { 
      return p.getName(); 
     }).toArray(String[]::new); 
     return AuthorityUtils.createAuthorityList(authorities); 
    } 
+1

Спасибо, но я в состоянии справиться с этим с '.antMatchers ("/привод/* * "). hasAuthority (" R_0") '. Проблема в том, что я не могу работать с интеграцией по безопасности Spring Boot Act по умолчанию, не требуя создания настраиваемых конфигураций, подобных этой. – alexanoid

+0

У меня такая же проблема. Замечено, что путем установки 'UserDetailsService' в' AuthenticationManagerBuilder' каким-то образом переопределяет конфигурацию безопасности по умолчанию, означающую необходимость в явной конфигурации доступа к URI, как вы это делали с помощью класса HttpSecurity. Вам удалось заставить его работать так, как вы ожидали? – RZet

+0

Да, вы должны использовать префикс 'ROLE_' для вашего' management.security.roles', например 'management.security.roles = ROLE_SOMENAME' – alexanoid

ответ

3

Вы должны использовать префикс ROLE_ для вашего management.security.roles, например management.security.roles=ROLE_SOMENAME для того, чтобы решить эту проблему

+0

Я думал, что в Spring Boot 1.5.1 значения свойства 'management.security.roles' не должны иметь префикс с' ROLE_'. Я нашел много путаницы по этому вопросу. Я полагаю, что ваша проблема также может быть исправлена ​​путем изменения следующих параметров «HttpSecurity» .antMatchers («/ actator/**»). HasAuthority («ROLE_R_0») вместо этого. – RZet

+0

antMatcher не решает проблему. Для контрольного экземпляра/конечной точки работоспособности возвращаются разные данные для авторизованного и неавторизованного пользователя. Невозможно реализовать на основе предоставленной конфигурации antMatcher – alexanoid

+0

Поведение, о котором вы говорите, описано в разделе 48.7 http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready -monitoring.html. Ваш исходный вопрос был около 403 кода состояния для вызова '/ actator/beans'. Я считаю, что это можно устранить, удалив оба параметра 'antMatchers («/actator ... »)' и убедитесь, что 'UserDetailsService' возвращает объект' UserDetails', содержащий 'GrantedAuthority', установленный в' ROLE_R_0' в вашем случае. В качестве альтернативы вы можете объединить его с «InMemoryUserDetailsManagerConfigurer», как я упомянул в комментарии к основному вопросу. – RZet

-1

По этой ссылке:

http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-monitoring.html

By default all sensitive HTTP endpoints are secured such that only users that have an ACTUATOR role may access them. Security is enforced using the standard HttpServletRequest.isUserInRole method.

Use the management.security.roles property if you want something different to ACTUATOR.

Так что я думаю, что все, что вам нужно сделать, это установить люди низкое свойство в application.properties.

management.security.roles 

Ex:

management.security.roles=R_0 
+0

Спасибо, но, пожалуйста, взгляните на мой вопрос. Я уже предоставил 'management.security.roles = R_0'. Проблема в том, что Spring Boot Actuator не понимает, как работать с текущей Spring Security по какой-то причине. – alexanoid

Смежные вопросы