PreAuthorize ne fonctionne pas sur le contrôleur
Je suis en train de définir des règles d'accès à la méthode de niveau mais cela ne fonctionne pas, afin que jamais.
SecurityConfiguration
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().
withUser("user").password("user").roles("USER").and().
withUser("admin").password("admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/v2/**").authenticated()
.and()
.httpBasic()
.realmName("Secure api")
.and()
.csrf()
.disable();
}
}
ExampleController
@EnableAutoConfiguration
@RestController
@RequestMapping({"/v2/"})
public class ExampleController {
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@RequestMapping(value = "/home", method = RequestMethod.GET)
String home() {
return "Hello World";
}
}
Chaque fois que j'essaie d'accès /v2/maison à l'aide de user:user
il exécute très bien, ne devrait-il pas me donner une erreur d'Accès Refusé en raison de "l'utilisateur" de ne pas avoir ROLE_ADMIN
?
Je suis en train de penser de l'amerrissage forcé les règles d'accès à la méthode de niveau et s'en tenir à http() ant les règles, mais j'ai besoin de savoir pourquoi il ne fonctionne pas pour moi.
source d'informationauteur prettyvoid
Vous devez vous connecter pour publier un commentaire.
Un problème commun avec l'aide de PrePost des annotations sur les contrôleurs, c'est que le Printemps méthode de sécurité est basé sur Spring AOP, qui est par défaut mis en œuvre avec JDK procurations.
Qui signifie qu'il fonctionne bien sur la couche de service qui est injecté dans la couche contrôleur comme les interfaces, mais il est ignoré sur la couche contrôleur parce contrôleur général, ne pas mettre en œuvre des interfaces.
Ce qui suit est juste mon avis:
J'ai eu un problème similaire et suivants résolu:
1) j'ai dû faire ma méthode public (c'est à dire faire de votre méthode à la maison (public)
2) - je utiliser hasRole au lieu de hasAuthority
Vous devez ajouter
@EnableGlobalMethodSecurity(prePostEnabled = true)
dans votre WebSecurityConfig.Vous pouvez le trouver ici: http://www.baeldung.com/spring-security-expressions-basic
Pour le faire travailler sur la couche contrôleur.
J'ai dû mettre le @EnableAspectJAutoProxy sur ma classe de configuration.
Exemple :
Il y a deux façons différentes d'utiliser cela, on est pour le préfixe et l'un ne l'est pas.
Et vous peut-être changer
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
à@PreAuthorize("hasAuthority('ADMIN')")
sera ok.suivant est
@PreAuthorize
code source.Si vous avez un contexte xml fichier pour votre sécurité, les haricots et une autre pour votre site web/servlet contexte, que vous als besoin d'ajouter:
à votre web-context.xml /servlet contexte. Sa ne suffit pas de l'ajouter dans le contexte de sécurité xml.
Ses pas hérité de l'enfant contextes.
HTH