La sécurité est partout. J'ai profité des vacances pour lire les documents de Shiro et documenter l'intégration de Spring Boot de Spring pour contrôler les droits d'accès en fonction des rôles dans la base de données
Introduction
Apache Shiro est un cadre de sécurité puissant et flexible et open source. Il gère l'authentification, l'autorisation, la gestion des sessions d'entreprise et le chiffrement proprement.
L'image ci-dessus montre l'architecture de base de Shiro
Authentification
Parfois appelé "connexion" pour prouver que l'utilisateur est l'utilisateur lui-même
Autorisation
Le processus de contrôle d'accès, c'est-à-dire déterminer "qui" accède "quoi"
Gestion de session
Gérez les sessions spécifiques à l'utilisateur. Dans Shiro, vous pouvez constater que toutes les informations de session utilisateur seront contrôlées par Shiro.
Cryptographie (cryptage)
Algorithmes de chiffrement sur les sources de données tout en assurant une facilité d'utilisation
Commencer
environnement
Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Données de printemps JPA Lombok
Ajouter des dépendances
Seules les principales dépendances Shiro sont données ici
<dependency> <proupId> org.apache.shiro </rompuprid> <letifactive> shiro-spring-boot-starter </ artifactid> <version> 1.4.0-rc2 </-version> </Dependency>
Configuration
Nous n'avons besoin que de la table d'utilisateurs et de la table des rôles pour le moment. La modification du fichier de configuration dans Spring Boot créera automatiquement une table de base de données pour nous
Serveur: Port: 8888Spring: DataSource: Driver-Class-Name: com.mysql.jdbc.Diver Nom d'utilisateur: Root Motword: Root Url: JDBC: MySql: // LocalHost: 3306 / Shiro? CharacterEncoding = UTF-8 & USESSL = False Jpa: Generate-Ddl: True Hibernate: DDL -AUTO: Generate-Ddl: vrai
entité
Java
@ Data @ EntityPublic class role {@id @generatedValue Private Integer ID; Private Long UserId; rôle de chaîne privée;}User.java
@ Data @ EntityPublic Class User {@id @GeneratedValue Private Long ID; Nom d'utilisateur de chaîne privée; Mot de passe de chaîne privé;}Royaume
Tout d'abord, créez la classe de royaume, héritez de l'autorisation de réalimentation et personnalisez nos propres méthodes d'autorisation et d'authentification. Realm est un composant qui peut accéder aux données de sécurité spécifiques à l'application, telles que les utilisateurs, les rôles et les autorisations.
Realm.java
La classe publique Realm étend AutorizationRealm {@Autowired Private UserService UserService; // Autoriser @Override Protected AuthorizationInfo doGetAuthorizationInfo (PrincipalCollection PrincipalCollection) {// Get Username à partir de la chaîne d'identification UserName = (String) SecurityUtils.getSubject (). GetPrincipal (); // requête l'objet utilisateur basé sur le nom d'utilisateur utilisateur utilisateur = userService.getUserByUserName (nom d'utilisateur); // Interroge les rôles appartenant à la liste d'utilisateurs <lage> list = roleService.FindByUserid (user.getId ()); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo (); pour (rôle de rôle: list) {// donne à l'utilisateur des informations de rôle.AddStringPermission (role.getRole ()); } retour des informations; } // Autoriser @Override Protected AuthenticationInfo doGetAuthenticationInfo (AuthenticationToken AuthenticationToken) lève AuthenticationException {// Obtenez le nom d'utilisateur de la chaîne utilisateur actuelle UserName = (String) authenticationToken.getPrincipal (); // Recherche de l'utilisateur à partir de l'utilisateur de la base de données utilisateur = userService.getUserByUserName (nom d'utilisateur); if (userService.getUserByUserName (nom d'utilisateur) == null) {lancez new UnknownAcTacontexception ("Les informations utilisateur correspondantes n'ont pas été trouvées dans ce système."); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo (user.getUserName (), user.getPassword (), getName ()); retour des informations; }}Classe de configuration de Shiro
Shiroconfig.java
@Configurationpublic class shiroconfig {@bean public shirofilterfactorybean shirofilterfactorybean (SecurityManager SecurityManager) {shirofilterfactorybean shirofilterfactorybean = new shirofilterfactorybean (); ShirofilterFactoryBean.SetSecurityManager (SecurityManager); Map <string, string> filterChainDefinitionMap = new LinkedHashMap <String, String> (); // Ce qui suit est la chaîne de filtre, filtrant dans l'ordre, donc / ** doit mettre la dernière ressource statique // ouvrir FilterChainDefinitionMap.put ("/ favicon.ico", "anon"); // icône Web FilterChainDefinitionMap.put ("/ **", "authc"); ShirofilterFactoryBean.SetFilterChainDefinitionMap (FilterChainDefinitionMap); retour shirofilterfactoryBean; } @Bean public DefaultWebSecurityManager SecurityManager () {DefaultWebSecurityManager DefaultWebSecurityManager = new DefaultWebSecurityManager (myRealm ()); return DefaultWebSecurityManager; } @Bean public myRealm myRealm () {myRealm myRealm = new MyRealm (); retourner myRealm; }}Contrôleur
UserController.java
@ControllerPublic class userController {@Autowired Private UserService UserService; @GetMapping ("/") public String index () {return "index"; } @GetMapping ("/ Login") public String Tologin () {return "Login"; } @GetMapping ("/ admin") public String admin () {return "admin"; } @PostMapping ("/ Login") public String dologin (String username, String Motword) {userNamepasswordToken token = new userNamepasswordToken (nom d'utilisateur, mot de passe); Sujet sujet = SecurityUtils.getSubject (); essayez {sujet.login (token); } catch (exception e) {e.printStackTrace (); } return "redirect: admin"; } @Getmapping ("/ home") public String home () {sujet sujet = SecurityUtils.getSubject (); essayez {sujet.CheckPermission ("admin"); } catch (exception unauthorizedException) {System.out.println ("pas d'autorisations suffisantes"); } retourner "à la maison"; } @GetMapping ("/ Logout") Public String Logout () {return "index"; }}Service
Userservice.java
@ServicePublic Class userservice {@autowired private userDao UserDao; Utilisateur public getUserByUserName (String Username) {return userdao.findByUsername (nom d'utilisateur); } @RequiresRoles ("admin") public void send () {System.out.println ("J'ai maintenant le rôle admin, et je peux exécuter cette instruction"); }}Calque d'affichage
admin.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html Lang = "en" /> <adref> <meta charset = "utf-8" /> <title> title </ title> </-head> <body> <form action = "/ ligin" methody = "post"> <fant type = " name = "username" /> <input type = "mot de passe" name = "mot de passe" /> <input type = "soumi" value = "login" /> </ form> </ body> </html>
home.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html lang = "en" /> <read> <meta charset = "utf-8" /> <t titre> Title </ title> </-head> </ body> </ body> </html>
index.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html Lang = "en" /> <adhead> <meta charset = "utf-8" /> <title> title </tapie> </read> <body> index <a href = "/ ligin" rel = "external nofollow dans </a> </body> </ html>
login.html
<! Doctype html> <html xmlns: th = "http://www.thymeleaf.org"> <html Lang = "en" /> <adref> <meta charset = "utf-8" /> <title> title </ title> </-head> <body> <form action = "/ ligin" methody = "post"> <fant type = " name = "username" /> <input type = "mot de passe" name = "mot de passe" /> <input type = "soumi" value = "login" /> </ form> </ body> </html>
Résumer
Ce petit cas met en œuvre le contrôle de l'accès des utilisateurs en fonction des rôles, dont le plus important est le domaine, qui agit comme un "pont" ou "connecteur" entre le shiro et les données de sécurité des applications.
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.