Apache Shiro est un cadre de sécurité open source puissant et flexible qui gère les processus de contrôle de sécurité communs dans les applications au niveau de l'entreprise telles que l'authentification, l'autorisation, la gestion de session et le chiffrement à un niveau à grain fin. L'objectif principal d'Apache Shiro est la facilité d'utilisation et la compréhension. Parfois, le contrôle des processus de sécurité peut être très compliqué, ce qui est un mal de tête pour les développeurs, mais cela ne le signifie pas nécessairement. Les cadres doivent masquer la complexité autant que possible et exposer une API concise et intuitive, simplifiant ainsi le travail des développeurs et garantissant la sécurité de leur application. Cette fois, nous parlerons de la façon d'utiliser Shiro pour implémenter le contrôle d'autorisation dans les applications Web Spring.
Fonction
Apache Shiro est un cadre complet de sécurité des applications avec de nombreuses fonctionnalités. La figure suivante montre les fonctions les plus importantes de Shiro:
Les principaux objectifs de Shiro sont les «quatre pierres angulaires de la sécurité des applications» - authentification, autorisation, gestion de session et chiffrement:
Architecture
D'un point de vue holistique, l'architecture de Shiro a trois concepts principaux: le sujet (sujet, c'est-à-dire l'utilisateur), le gestionnaire de sécurité (responsable de la sécurité) et les royaumes (domaine). La figure suivante décrit la relation entre ces composants:
Ces composants peuvent être compris comme suit:
Préparation des données
Dans les applications Web, le principal contrôle sur la sécurité est les rôles, les ressources et les autorisations (quel rôle peut accéder aux ressources). Un utilisateur peut avoir plusieurs rôles et un rôle peut également accéder à plusieurs ressources, c'est-à-dire qu'un rôle peut correspondre à plusieurs autorisations. Pour implémenter la conception de la base de données, nous devons construire au moins 5 tables: table utilisateur, table de rôle, table de ressources, table-ressource de rôle, table-role utilisateur. La structure de ces 5 tables est la suivante:
Tableau utilisateur:
| identifiant | nom d'utilisateur | mot de passe |
|---|---|---|
| 1 | Zhang San | 123456 |
| 2 | Li si | 6666666 |
| 3 | Wang wu | 000000 |
Liste des rôles:
| identifiant | rolename |
|---|---|
| 1 | administrateur |
| 2 | directeur |
| 3 | personnel |
Tableau de ressources:
| identifiant | nom |
|---|---|
| 1 | / utilisateur / ajouter |
| 2 | / utilisateur / supprimer |
| 3 | / Compony / Info |
Tableau de ressources de rôle:
| identifiant | rôti | Résidence |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
Tableau de race utilisateur:
| identifiant | ID de l'utilisateur | rôti |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
La classe POJO correspondante est la suivante:
/ ** * utilisateur * / classe publique User {private Integer id; Nom d'utilisateur de chaîne privée; mot de passe de chaîne privé; // Getter & Setter ...} / ** * Rôle * / Rôle de classe publique {ID de chaîne privée; chaîne privée rolename;} / ** * RESSOURCE * / CLASSE PUBLIQUE RESSOURCE {Private String ID; Resname de chaîne privée;} / ** * Role-Resource * / public class roleres {private String id; RoleId de chaîne privée; résidence de chaîne privée;} / ** * utilisateur-role * / classe publique userrole {private String id; String privé utilisateur IDID; Roled de chaîne privée;} Pour des étapes détaillées pour intégrer le printemps et le shiro, veuillez vous référer à mon blog "Intégration d'Apache Shiro dans les applications de printemps". Ici, nous ajoutons: vous devez introduire les dépendances de Shiro à l'avance, ouvrir mvnrepository.com et rechercher Shiro. Nous avons besoin des trois premières dépendances, à savoir Shiro-core, Shiro-Web et Shiro-Spring. Prendre le projet Maven à titre d'exemple, ajoutez les dépendances suivantes sous le nœud <dependencies> dans pom.xml :
<Dedendency> <ProupId> org.apache.shiro </rompuprid> <letifactive> shiro-core </ artifactid> <version> 1.4.0 </ version> </dependency> <Dedidency> <ProupId> org.apache.shiro </prôdId> <Artifactid> shiro-web </ptetifactid> <version> 1.4.0 </ version> </Dedendency> <version> 1.4.0 <version> <GroupId> org.apache.shiro </rombandid> <ArtefactId> shiro-spring </retifactid> <version> 1.4.0 </ version> </pedidency>
Dans application-context.xml vous devez configurer shiroFilter comme ceci:
<! - Configurer la classe Filter Factory de Shiro, id-shirofilter doit être cohérente avec les filtres que nous avons configurés dans web.xml -> <bean id = "shirofilter"> <propriété name = "securityManager" ref = "SecurityManager" /> <! - Page de connexion -> <propriété name = "Loginurl" Value = "/ Login" /> <! name = "SuccessUrl" value = "/ index" /> <! - Accès illégal aux pages sautées -> <propriété name = "UnauthorizedUrl" value = "/ 403" /> <! - Configuration d'autorisation -> <propriété name = "FilterChainDefinitionS"> <Value> <! - Ressources statiques qui peuvent être accédées sans authentification et autres URL À l'exception des ressources ignorées ci-dessus, toutes les autres ressources doivent être authentifiées avant de pouvoir accéder -> / ** = Authc </value> </promest> </ban>
Ensuite, vous devez définir le royaume. Custom Realm est intégré à la classe AuthorizingRealm :
La classe publique MyRealm étend AutorizingRealm {@Autowired Private UserService UserService; / ** * Autorisation de vérification * / @Override Protected AuthorizationInfo doGetAuthorizationInfo (PrincipalCollection PrincipalCollection) {String LoginName = SecurityUtils.getSubject (). GetPrincipal (). ToString (); if (loginname! = null) {String userId = SecurityUtils.getSubject (). getSession (). getAtTribute ("usersessionId"). toString (); // Objet d'information d'autorisation, utilisé pour stocker tous les rôles et autorisations de l'utilisateur trouvé simpleautauthezationInfo info = new SimpleAutorizationInfo (); // User Role Collection Shirouser Shirouser = (Shirouser) PrincipalCollection.GetPrimaryPrincipal (); info.setroles (shirouser.getroles ()); info.AddStringPerMissions (shirouser.getUrlSet ()); retour des informations; } return null; } / ** * Fonction de rappel d'authentification, appel * / authentification protégéInfo doGetAuthenticationInfo (token AuthenticationToken) {String username = (string) token.getPrincipal (); Utilisateur utilisateur = nouveau utilisateur (); sysuser.sesername (nom d'utilisateur); essayez {list <sysuser> utilisateurs = userService.FindByNames (utilisateur); List <string> roleList = userService.SelectrolenamelistByUserid (users.get (0) .getId ()); if (users.size ()! = 0) {String pwd = users.get (0) .getPassword (); // Une fois que toutes les vérifications sont passées, mettez les informations de l'utilisateur dans la session Session Session = SecurityUtils.getSubject (). Getession (); session.setAttribute ("Usersession", users.get (0)); session.setAttribute ("UsersessionId", users.get (0) .getId ()); session.setAttribute ("userroles", org.apache.commons.lang.stringutils.join (roleList, ",")); Renvoie un nouveau SimpleAuthenticationInfo (nom d'utilisateur, userst.get (0) .getPassword ()); } else {// L'utilisateur n'a pas été trouvé à lancer un nouveau inconnuectivexception (); }} catch (exception e) {System.out.println (e.getMessage ()); } return null; } / ** * Mettez à jour le cache d'informations d'autorisation utilisateur. * / public void ClearCachedAuthorizationInfo (PrincipalCollection Principals) {Super.CLEARCACHEDAUTHORISTIONInfo (directeurs); } / ** * Mettez à jour le cache d'informations utilisateur. * / public void ClearCachedAuthenticationInfo (PrincipalCollection Principals) {Super.CLEARCACHEDAUTHENTICTIONININFO (directeurs); } / ** * Effacer le cache d'informations d'autorisation utilisateur. * / public void clearallcachedAuthorizationInfo () {getAuthorizationCache (). Clear (); } / ** * Effacer le cache d'informations utilisateur. * / public void clearallcachedAuthenticationInfo () {getAuthenticationCache (). Clear (); } / ** * Effacer tous les caches * / public void clearCache (PrincipalCollection Principals) {super.clearcache (directeurs); } / ** * Effacer tous les caches d'authentification * / public void clearallcache () {clearallcachedAuthenticationInfo (); ClearallCachedAuthorizationInfo (); }}Enfin, définissez un contrôleur pour la connexion de l'utilisateur pour accepter les demandes de connexion de l'utilisateur:
@ControllerPublic class userController {/ ** * utilisateur Login * / @postMapping ("/ Login") Public String Login (@valid utilisateur, BindingResult BindingResult, RedirectAttributes RedirectAttributes) {try {if (bindingResul } // Utilisez l'outil d'autorisation pour l'authentification, après la connexion avec succès, sautez vers SuccessUrl définie dans le shirofilter bean SecurityUtils.getSubject (). Login (new userNamepasswordToken (user.geTuserName (), user.getPassword ())); return "redirection: index"; } catch (AuthenticationException e) {redirectattributes.addflashAttribute ("Message", "Nom d'utilisateur ou mot de passe d'erreur"); Renvoie "Redirection: connexion"; }} / ** * Logout * / @getMapping ("/ Logout") Public String Logout (RedirectAttributes RedirectAttributes) {SecurityUtils.getSubject (). Logout (); Renvoie "Redirection: connexion"; }}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.