web-dev-qa-db-fra.com

La sécurité des points d'extrémité Spring Boot Actuator ne fonctionne pas avec la configuration de sécurité Spring personnalisée

Voici l'actionneur Spring Boot 1.5.1 application.properties:

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

C'est ma 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();
    }

}

À l'heure actuelle, je parviens à me connecter à mon application avec un bon utilisateur disposant des droits R_0, mais lorsque j'essaie d'accéder, par exemple

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

Je reçois une erreur suivante:

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

Comment configurer correctement Spring Boot Actuator afin d’être au courant de la bonne Authentication?

En ce moment, pour que cela fonctionne, je dois faire le tour suivant:

management.security.enabled=false

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

Y at-il une chance de configurer l'actionneur de la bonne manière?

MIS À JOUR

J'utilise UserDetailsService.UserDetails.Authorities

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

Pour résoudre ce problème, vous devez utiliser le préfixe ROLE_ pour votre management.security.roles, par exemple management.security.roles=ROLE_SOMENAME

4
alexanoid

Pour avoir l'autorisation de déclencher des points de terminaison d'actionneur à ressort, vous devez disposer de R&OCIRC;LE ..... Reportez-vous à cet exemple Accès aux points de terminaison d'actionneur restreints avec la sécurité à ressort

0
Dhiraj Ray