Les ordinateurs d'extrémité Spring Boot Actuator sont par défaut protégés par la sécurité http de base.
Peut-on changer pour utiliser Spring Security? J'ai correctement configuré Spring Security et l’utilise pour protéger mes autres pages.
J'ai essayé security.basic.enabled: false
et en ajoutant .antMatchers("/manage/**").hasRole("ADMIN")
dans mes demandes d'autorisation (notez que j'utilise une URL différente en tant que racine pour les ordinateurs d'extrémité), mais cela n'a pas aidé . Je continue de recevoir un journal d'authentification http de base, qui n'est pas configuré par les utilisateurs. le AuthenticationManager.
Une idée?
EDIT - fournissant plus de détails -
Mon application.Java ressemble à:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends WebMvcConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/app").setViewName("app/index");
registry.addViewController("/app/login").setViewName("app/login");
}
@Bean
public ApplicationSecurity applicationSecurity() {
return new ApplicationSecurity();
}
@Order(Ordered.LOWEST_PRECEDENCE - 8)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off
auth.inMemoryAuthentication()
.withUser("test1")
.password("test1pw")
.roles("USER", "ADMIN")
.and()
.withUser("test2")
.password("test2pw")
.roles("USER");
// @formatter:on
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/app/login").permitAll()
.antMatchers("/app/**").hasRole("USER")
.antMatchers("/manage/**").hasRole("ADMIN")
.and()
.formLogin()
.loginPage("/app/login")
.failureUrl("/app/login?error")
.defaultSuccessUrl("/app")
.permitAll()
.and()
.logout()
.logoutUrl("/app/logout")
.logoutSuccessUrl("/app/login?logout");
// @formatter:on
}
@Override
public void configure(WebSecurity web) throws Exception {
// @formatter:off
web
.ignoring()
.antMatchers("/assets/**");
// @formatter:on
}
}
}
Dans mon application.yml
j'ai aussi:
management:
context-path: /management
Notez que sa configuration est identique à celle du guide que vous avez mentionné.
Maintenant, ce que je souhaiterais - ou aimerais configurer - est que les points de terminaison/gérer comme la santé, les mappages, etc. soient protégés avec les utilisateurs du AuthenticationManager personnalisé.
J'ai également essayé d'ajouter management.security.enabled=false
et cela désactive en effet l'authentification, par exemple. /manage/mappings. Le problème, c’est que j’ai dit explicitement à Spring Security de protéger ces urls via:
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/app/login").permitAll()
.antMatchers("/app/**").hasRole("USER")
.antMatchers("/manage/**").hasRole("ADMIN")
mais ça ne marche pas. Notez que les autres joueurs autorisés travaillent… .. Je me demande s’il ya quelque chose à faire dans le calendrier/l’ordre. J'ai copié @Order(Ordered.LOWEST_PRECEDENCE - 8)
à partir de l'exemple mais je ne sais pas pourquoi - 8 est utilisé.
Pour approfondir un peu plus, j'ai aussi exécuté l'exemple ( https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web- method-security ) moi-même et je constate le même comportement dans l'exemple d'application . La sécurité de gestion semble totalement indépendante des utilisateurs user
et admin
configurés dans l'authentification en mémoire de l'exemple.
Peut-on changer pour utiliser Spring Security?
C’est est Spring Security (que pensez-vous que nous utiliserions de plus?). Si vous souhaitez simplement conserver les règles de sécurité par défaut et personnaliser la variable AuthenticationManager
, elle ne devrait fonctionner que si vous utilisez la variable AuthenticationManagerBuilder
comme recommandé par l'équipe de sécurité Spring. Le exemple de méthode sécurisée a le comportement que vous recherchez, vous pouvez donc copier le modèle de configuration à partir de cet emplacement. Si vous souhaitez remplacer la stratégie d’authentification par défaut du démarrage, l’essentiel est d’obtenir la valeur AuthenticationManager
configurée dans une GlobalAuthenticationConfigurerAdapter
comme dans l’exemple .
Vous pouvez désactiver la sécurité de gestion avec management.security.enabled=false
(en supposant que Spring Security se trouve sur le chemin d'accès aux classes). Il est mentionné dans le guide de l'utilisateur , mais n'hésitez pas à proposer des clarifications.
Je dirais qu'il est parfois plus facile d'exclure la configuration automatique du composant Spring Boot et d'effectuer une configuration à partir de zéro si vous avez un cas très spécifique. Dans ce cas, vous pouvez utiliser:
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})
Ou simplement ManagementWebSecurityConfiguration.Java
si vous souhaitez conserver le reste de la configuration de Boot Security. Et puis vous pourriez utiliser quelque chose comme ça:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration {
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {
private final SecurityProperties securityProperties;
@Autowired
AuthenticationSecurity(SecurityProperties securityProperties) {
this.securityProperties = securityProperties;
}
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
// configuration
}
}
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
private SecurityProperties security;
@Autowired
protected ApplicationSecurity(SecurityProperties security) {
this.security = security;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// you configuration
}
}
}
Comme vous pouvez le voir, j’ai réutilisé les propriétés de sécurité dans ce cas afin d’éviter de créer les miennes.