Cet article raconte l'histoire de Spring Boot Intégration de Spring Security pour implémenter le contrôle d'autorisation à l'aide d'annotations sur les méthodes et à l'aide d'un utilisateur personnalisé pour charger les informations de l'utilisateur de MySQL. Utilisez le cryptage MD5 qui est livré avec la sécurité pour crypter le mot de passe de l'utilisateur. Le modèle de page utilise le moteur Thymeleaf.
Adresse du code source: https://github.com/li5454yong/springboot-security.git
1. Présenter les dépendances de POM
<parent> <proupId> org.springframework.boot </rompuprid> <lefactive> printemps-boot-starter-parent </retifactid> <version> 1.4.4.release </-version> </parestades> <dependency> <proupId> org.springframework.boot </prounid> <artifactid> spring-boot-starterweb </prountid> <artifactid> </Dependency> <Dependency> <GroupId> org.springFramework.boot </proupId> <ArtifActid> printemps-boot-starter-security </ artifactid> </dependency> <dependency> <proupId> org.springframework.security.oauth </prounid> <artifactid> printemps-ecurity-oaUt <dependency> <proupId> org.springframework.boot </proupId> <Artifactid> printemp-boot-starter-thymeleaf </ artifactid> </pedigency> <dependency> <proupId> org.springframework.boot </prouvendid> <etifactid> Spring-Boot-starter-data-jpa </tifactive> </ dépendance>-starter-data-jpa </tifactive> </ dépendance> <GroupId> org.springframework.boot </proupId> <ArtifactId> printemps-boot-starter-jdbc </retifactid> </dependency> <dependency> <proupId> mysql </proupId> <Artefactid> MySQL-Connector-Java </ratifactive> <version> 5.1.34 </De version> <GroupId> com.alibaba </rom grouped> <ArtefactId> Druid </ artifactId> <DERSE> 1.0.15 </ version> </Dependency> </Dependces>
Ici, utilisez le regroupement de connexion Druid et les données de ressort JPA implémentent l'accès à la base de données.
2. Configurer la sécurité du ressort
@ Configuration @ activerwebmvcSecurity @ activerglobalthodsecurity (prestenabled = true) // activer la classe de sécurité publique de la classe WebSecurityConfig étend WebSecurityConfigurerArAnager () lance l'exception {return super.authenticationmanager ();); } @Override Protected void configure (httpsecurity http) lève une exception {// permettre à tous les utilisateurs d'accéder à "/" et "/ home" http.authorizeRequests () .antmatchers ("/", "home"). Permutall () // accession à d'autres adresses nécessitent des permissions. // Spécifiez la page de connexion à "/ connexion" .logInPage ("/ Login") .DefaultSucCessUrl ("/ Hello") // Après la connexion réussie, sautez à "/ bonjour" par défaut. .permitall () .and () .logout () .logoutsuccessurl ("/ home") // L'URL par défaut après la connexion est "/ home" .permitall (); } @Autowired public void configureGlobal (AuthenticationManagerBuilder Auth) lève une exception {Auth .UserDetailSService (PustomUserDetailSService ()) .PassWordEncoder (PasswordEncoder ()); } / ** * Définissez la méthode de cryptage du mot de passe utilisateur sur MD5 Encryption * @return * / @bean public md5passwordEncoder PasswordEncoder () {return new MD5PasswordEncoder (); } / ** * UserDetailSService personnalisé pour lire les informations de l'utilisateur de la base de données * @return * / @bean public CustomUserDetailSService CustomUserDetailSService () {return new CustomUserDeTailSservice (); }} Seules les configurations de base sont effectuées ici, la configuration de l'URL de connexion, l'URL qui saute après la connexion est réussie et l'URL qui saute après déconnexion. L'utilisation de l'annotation @enableglobalthodsecurity (prepossenabled = true) peut permettre l'annotation de la sécurité. Nous pouvons utiliser @PreAuthorize et @Prefilter sur des méthodes qui nécessitent des autorisations de contrôle.
3. UserDetailService personnalisé
classe publique CustomUserDetailSService implémente userDetailSService {@Autowired // Domain Service Class SuserService Private SuserService; @Override public UserDetails LoadUserByUserName (String Username) lève UsernamenotFoundException {// susserr if (user == null) {lancer un nouveau userNameNotFoundException ("nom d'utilisateur" + nom d'utilisateur + "non trouvé"); } // SecurityUser implémente UserDetails et Maps Sser's E-mail à UserName SecurityUser SecurityUser = new SecurityUser (utilisateur); Collection <SimpleGrantedAuthority> Authorities = new ArrayList <SimpleGrantedAuthority> (); autorités.add (new SimpleGrantedAuthority ("role_admin")); return SecurityUser; }}Ici, il vous suffit d'implémenter l'interface UserDetailSService, de réécrire la méthode LoadUserByUsername et de récupérer les informations utilisateur de la base de données. Enfin, une classe d'implémentation UserDetails est renvoyée.
4. Définissez la configuration de gestion des erreurs
@ConfigurationPublic Class ErrorPageConfig {@Bean public EmbedDeDServletContainerCustomzer EntembedDeservletContainerCusizizer () {return new MyCustomizer (); } classe statique privée MyCustomzer implémente EmbedDedServletContainerCustanizer {@Override public void personnaliser (ContifiableMedDedServletContainer Container) {contener.adderrorpages (new ErrorPage (httpstatus.forbidden, "/ 403")); }}}Lorsqu'une erreur d'accès se produit, passez à "/ 403".
5. Interface du contrôleur
@ControllerPublic Class IndexController {@Resource Private SuserService susservice; @RequestMapping ("/ home") public String home () {return "home"; } @PreAuthorize ("Hasrole ('User')") @RequestMapping (value = "/ admin", méthode = requestMethod.get) public string toadmin () {return "helloadmin"; } @RequestMapping ("/ Hello") String public hello () {return "Hello"; } @RequestMapping ("/ Login") Public String Login () {return "Login"; } @RequestMapping ("/") public String root () {return "index"; } @RequestMapping ("/ 403") Public String Error () {return "403"; }}@PreAuthorize ("Hasrole ('utilisateur')") est utilisé sur la méthode Toadmin (), indiquant que vous devez avoir le rôle utilisateur pour accéder à cette méthode. Si vous souhaitez contrôler le niveau des autorisations, vous pouvez utiliser @preAuthorize ("Haspermission ()"). Ce n'est qu'un des usages. Pour plus de méthodes d'utilisation, vous pouvez lire la documentation officielle. Il convient de noter que le préfixe de rôle par défaut de Spring Security est "Role_", qui a été ajouté par défaut lors de l'utilisation de la méthode Hasrole. Par conséquent, notre rôle d'utilisateur dans la base de données doit être "Role_User", et le préfixe de l'utilisateur "Role_" est ajouté avant l'utilisateur.
6. Test
Démarrez le projet et visitez http: // localhost: 1130 / connexion
Cliquez pour vous connecter et saisir "/ bonjour"
Cliquez pour sauter sur la page Administrateur
Dans l'arrière-plan "/ admin" URL correspondant à la méthode "utilisateur", les utilisateurs doivent avoir le rôle "utilisateur". L'utilisateur qui s'est connecté est également défini dans la base de données pour avoir ce rôle.
Maintenant, nous modifions le rôle utilisateur dans la base de données et le modifions en "Role_admin". Après vous être connecté, connectez-vous à nouveau, cliquez à nouveau sur le bouton "Accédez à la page Administrateur" et il sautera à la page suivante.
Parce qu'il n'y a pas d'autorisation "utilisateur" maintenant, une exception a été lancée pendant l'accès, et elle a été interceptée et redirigée vers "/ 403".
7. Post accès, code d'erreur 403
Tout d'abord, modifiez "/ admin" pour publier la demande
@PreAuthorize ("Hasrole ('User')") @RequestMapping (value = "/ admin", méthode = requestMethod.post) public String toadmin () {return "helloAdmin"; }Modifiez la méthode de demande du bouton "Accédez à la page Administrator" de la soumission de la soumission du formulaire de formulaire d'origine à Ajax. Quant à savoir pourquoi nous ne sommes pas soumis à l'aide de Form Post, nous en parlerons plus tard. Modifiez d'abord le code
<body> <h1 th: inline = "text"> bonjour [[$ {# httpservletRequest.remoteUser}]]! </h1> <! - <formulaire th: action = "@ {/ logout}" méthode = "Post"> <entrée = "soumettre" value = "Signet" /> </ form> <form th: type = "soumi" th: value = "accédez à la page Administrator" /> </ form> -> <a th: href = "@ {/ admin}" rel = "external nofollow"> accéder à la page d'utilisateur de l'administrateur </a> <entrée th: type = "soumettre" onclick = "testPost ()" th: value = "Go to the Administrateur" $ .ajax ({url: "/ admin", type: 'post', succès: fonction (data) {}}); } </ script> Cliquez sur le bouton "Accédez à la page Administrateur", et vous pouvez voir ce qui suit dans la plateforme de débogage
En effet
Voici une solution:
Ajoutez d'abord le contenu suivant dans la balise.
<meta name = "_ csrf" th: content = "$ {_ csrf.token}" /> <meta name = "_ csrf_hader" th: content = "$ {_ csrf.headername}" /> Tant que ce jeton est ajouté, l'arrière-plan vérifiera l'exactitude de ce jeton. S'il est correct, il acceptera le post-accès.
Ajoutez ensuite le code suivant dans le code AJAX:
var token = $ ('meta [name = "_ csrf"]'). attr ("contenu"); var header = $ ('meta [name = "_ csrf_hader"]'). att ("contenu"); $ (document) .ajaxSend (function (e, xhr, opt) {xhr.Setrequestheder. De cette façon, vous pouvez y accéder normalement en utilisant le post, la suppression et d'autres méthodes.
Les ci-dessus en utilisant la méthode de formulaire post-formulaire à soumettre. Vous pouvez voir en affichant le code source de la page.
Le cadre insère automatiquement un champ caché dans le formulaire de formulaire, et la valeur de la valeur est que le jeton, donc en utilisant le formulaire de formulaire pour soumettre une demande de poste peut être directement adopté, et si vous le soumettez de manière AJAX, ce code doit être ajouté.
D'accord, c'est tout sur cet article. Il y aura des articles plus tard sur la façon d'utiliser la sécurité de Spring pour contrôler les autorisations dans le style API REST.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.