recherche
Maisondéveloppement back-endtutoriel phpManuel d'utilisation d'Apache Shiro (3) Autorisation Shiro

L'autorisation est un contrôle d'accès, qui déterminera si l'utilisateur dispose des droits d'accès correspondants aux ressources de l'application.

Par exemple, déterminez si un utilisateur a l'autorisation d'afficher des pages, l'autorisation de modifier des données, l'autorisation d'avoir un certain bouton et s'il a l'autorisation d'imprimer, etc.

1. Trois éléments d'autorisation

L'autorisation comporte trois éléments principaux : les autorisations, les rôles et les utilisateurs.

Autorisations

Les autorisations sont l'élément central du mécanisme de sécurité d'Apache Shiro. Il indique clairement le comportement et les performances autorisés dans l'application. Une déclaration d'autorisations bien formatée communique clairement les autorisations dont dispose un utilisateur sur la ressource.

La plupart des ressources prendront en charge les opérations CRUD typiques (créer, lire, mettre à jour, supprimer), mais il est logique que toute opération soit basée sur une ressource spécifique. Par conséquent, l’idée fondamentale de la déclaration d’autorisation est basée sur les ressources et les opérations.

Grâce à la déclaration d'autorisation, nous ne pouvons comprendre que ce que cette autorisation peut faire dans l'application, mais nous ne pouvons pas déterminer qui possède cette autorisation.

Nous devons donc associer les utilisateurs et les autorisations dans l'application.

L'approche habituelle consiste à attribuer des autorisations à un rôle puis à associer ce rôle à un ou plusieurs utilisateurs.

Déclaration d'autorisation et granularité

La déclaration d'autorisation Shiro utilise généralement des expressions séparées par des deux-points. Comme mentionné précédemment, une expression d'autorisation peut spécifier clairement le type de ressource, les opérations autorisées et les données accessibles. Dans le même temps, les expressions d'autorisation Shiro prennent en charge de simples caractères génériques, permettant des paramètres d'autorisation plus flexibles.

Ce qui suit utilise des exemples pour illustrer les expressions d'autorisation.

Peut interroger les données utilisateur

Utilisateur:afficher

Peut interroger ou modifier les données utilisateur

Utilisateur:afficher, modifier

Peut modifier Les données utilisateur effectuent toutes les opérations

Utilisateur :* ou l'utilisateur

peut modifier les données utilisateur avec l'identifiant 123

Utilisateur :modifier:123

rôle
Shiro prend en charge deux modes de rôle :

1. Rôle traditionnel : un rôle représente une série d'opérations lorsqu'une opération doit être autorisée et vérifiée, il vous suffit de déterminer s'il s'agit du rôle Can. . Ce type d'autorisations de rôle est relativement simple et vague, ce qui n'est pas propice à l'expansion.

2. Rôle d'autorisation : un rôle dispose d'un ensemble d'autorisations. Lors de la vérification de l'autorisation, il est nécessaire de déterminer si le rôle actuel dispose de l'autorisation. Ce type d'autorisations de rôle peut fournir des descriptions détaillées des autorisations pour le rôle et convient aux conceptions d'autorisations plus complexes.

La mise en œuvre de l'autorisation des deux modes de rôle sera décrite en détail ci-dessous.

2. Implémentation de l'autorisation

Shiro prend en charge trois façons d'implémenter le processus d'autorisation :

Implémentation du codage
Implémentation de l'annotation
Implémentation JSP Taglig

1. Implémentation d'autorisation basée sur le codage

1.1 Implémentation d'autorisation basée sur des rôles traditionnels

Lorsque vous devez vérifier si un utilisateur a un certain rôle, vous pouvez appeler la méthode hasRole* du Sujet exemple à vérifier.

Les méthodes de vérification associées sont les suivantes :
Subject currentUser = SecurityUtils.getSubject(); 

if (currentUser.hasRole("administrator")) { 

//show the admin button 

} else { 

//don't show the button? Grey it out? 

}



Description de la méthode du sujet

hasrole (String Rolename) 🎜>

hasRoles( List roleNames) Renvoie un tableau de valeurs booléennes correspondant dans l'ordre de la liste

hasAllRoles(Collection roleNames) Renvoie vrai si l'utilisateur a tous les rôles spécifiés

Prise en charge des assertions

Shiro prend également en charge la vérification des autorisations via des assertions. Si l'assertion réussit, aucune valeur n'est renvoyée et le programme continue son exécution ; si l'assertion échoue, un message d'exception sera généré. L'utilisation d'assertions peut rendre notre code plus concis.



Méthodes d'assertion pertinentes :

Subject currentUser = SecurityUtils.getSubject(); 

//guarantee that the current user is a bank teller and 

//therefore allowed to open the account: 

currentUser.checkRole("bankTeller"); 

openBankAccount();
Méthode du sujet                                                                                                                                                                              🎜>checkRoles(Collection roleNames. ) Affirmer si l'utilisateur a tous les rôles spécifiés

checkRoles(String ... roleNames) Surcharge de méthode de la méthode précédente

1.2 Implémentation d'autorisation basée sur les rôles d'autorisation

Par rapport au modèle de rôle traditionnel, le modèle de rôle basé sur les autorisations est moins couplé. modifier le code source en raison des changements de rôles. Par conséquent, le modèle de rôle basé sur les autorisations est une meilleure méthode de contrôle d'accès.

Son implémentation de code a les méthodes d'implémentation suivantes :

1. Implémentation basée sur l'objet d'autorisation


Créez une instance de org.apache.shiro.authz.Permission, et ceci. L'objet d'instance est transmis en tant que paramètre à Subject.isPerMIT() pour vérification.


Les méthodes pertinentes sont les suivantes :



Méthode du sujet Description

Permission printPermission = new PrinterPermission("laserjet4400n", "print"); 

Subject currentUser = SecurityUtils.getSubject(); 

if (currentUser.isPermitted(printPermission)) { 

//show the Print button 

} else { 

//don't show the button? Grey it out? 

} 

Permission printPermission = new PrinterPermission("laserjet4400n", "print"); 

Subject currentUser = SecurityUtils.getSubject(); 

if (currentUser.isPermitted(printPermission)) { 

//show the Print button 

} else { 

//don't show the button? Grey it out? 

}
isPermise(Permission p) Lorsque le sujet dispose de l'autorisation spécifiée, treu est revenu

isPermitted(List perms)    返回对应权限的boolean数组    

isPermittedAll(Collection perms)    Subject拥有所有制定权限时,返回true    

2、 基于字符串的实现 

相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。 

Subject currentUser = SecurityUtils.getSubject(); 

if (currentUser.isPermitted("printer:print:laserjet4400n")) { 

//show the Print button 

} else { 

//don't show the button? Grey it out? 

}

使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission 默认支持的实现方式。 

这里分别代表了 资源类型:操作:资源ID 

类似基于对象的实现相关方法,基于字符串的实现相关方法: 

isPermitted(String perm)、isPermitted(String... perms)、isPermittedAll(String... perms) 

基于权限对象的断言实现 

Subject currentUser = SecurityUtils.getSubject(); 

//guarantee that the current user is permitted 

//to open a bank account: 

Permission p = new AccountPermission("open"); 

currentUser.checkPermission(p); 

openBankAccount();

基于字符串的断言实现 

Subject currentUser = SecurityUtils.getSubject(); 

//guarantee that the current user is permitted 

//to open a bank account: 

currentUser.checkPermission("account:open"); 

openBankAccount();

断言实现的相关方法 

Subject方法    说明    

checkPermission(Permission p)    断言用户是否拥有制定权限    

checkPermission(String perm)    断言用户是否拥有制定权限    

checkPermissions(Collection perms)    断言用户是否拥有所有指定权限    

checkPermissions(String... perms)    断言用户是否拥有所有指定权限

   

2、基于注解的授权实现 

Shiro注解支持AspectJ、Spring、Google-Guice等,可根据应用进行不同的配置。 

相关的注解: 

@ RequiresAuthentication 

可以用户类/属性/方法,用于表明当前用户需是经过认证的用户。 

@RequiresAuthentication 

public void updateAccount(Account userAccount) { 

//this method will only be invoked by a 

//Subject that is guaranteed authenticated 

... 

} 

@ RequiresGuest

表明该用户需为”guest”用户 

@ RequiresPermissions 

当前用户需拥有制定权限 

@RequiresPermissions("account:create") 

public void createAccount(Account account) { 

//this method will only be invoked by a Subject 

//that is permitted to create an account 

... 

} 

@RequiresRoles

当前用户需拥有制定角色 

@ RequiresUser 

当前用户需为已认证用户或已记住用户 

3、基于JSP TAG的授权实现 

Shiro提供了一套JSP标签库来实现页面级的授权控制。 

在使用Shiro标签库前,首先需要在JSP引入shiro标签: 

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

下面一一介绍Shiro的标签: 

guest标签 

验证当前用户是否为“访客”,即未认证(包含未记住)的用户 

<shiro:guest> 

Hi there! Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today! 

</shiro:guest>

user标签 

认证通过或已记住的用户 

<shiro:user> 

Welcome back John! Not John? Click <a href="login.jsp">here<a> to login. 

</shiro:user>

authenticated标签 

已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。 

<shiro:authenticated> 

<a href="updateAccount.jsp">Update your contact information</a>. 

</shiro:authenticated> 

notAuthenticated标签

未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。 

<shiro:notAuthenticated> 

Please <a href="login.jsp">login</a> in order to update your credit card information. 

</shiro:notAuthenticated>

principal 标签 

输出当前用户信息,通常为登录帐号信息 

Hello, <shiro:principal/>, how are you today?

验证当前用户是否属于该角色 

<shiro:hasRole name="administrator"> 

<a href="admin.jsp">Administer the system</a> 

</shiro:hasRole>

lacksRole标签 

与hasRole标签逻辑相反,当用户不属于该角色时验证通过 

<shiro:lacksRole name="administrator"> 

Sorry, you are not allowed to administer the system. 

</shiro:lacksRole>

hasAnyRole标签 

验证当前用户是否属于以下任意一个角色。 

<shiro:hasAnyRoles name="developer, project manager, administrator"> 

You are either a developer, project manager, or administrator. 

</shiro:lacksRole>

hasPermission标签 

验证当前用户是否拥有制定权限 

<shiro:hasPermission name="user:create"> 

<a href="createUser.jsp">Create a new User</a> 

</shiro:hasPermission>

lacksPermission标签 

与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过 

<shiro:hasPermission name="user:create"> 

<a href="createUser.jsp">Create a new User</a> 

</shiro:hasPermission>

三、Shiro授权的内部处理机制 

Manuel dutilisation dApache Shiro (3) Autorisation Shiro

1、在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等) 

2、Sbuject的实例通常是DelegatingSubject类(或子类)的实例对象,在认证开始时,会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。 

3、接下来SecurityManager会委托内置的Authorizer的实例(默认是ModularRealmAuthorizer 类的实例,类似认证实例,它同样支持一个或多个Realm实例认证)调用相应的授权方法。 

4、每一个Realm将检查是否实现了相同的 Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。 

当使用多个Realm时,不同于认证策略处理方式,授权处理过程中: 

1、当调用Realm出现异常时,将立即抛出异常,结束授权验证。 

2、只要有一个Realm验证成功,那么将认为授权成功,立即返回,结束认证。

以上就是Apache Shiro 使用手册(三)Shiro 授权的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Comment fonctionne la résistance au type PHP, y compris les types scalaires, les types de retour, les types d'union et les types nullables?Comment fonctionne la résistance au type PHP, y compris les types scalaires, les types de retour, les types d'union et les types nullables?Apr 17, 2025 am 12:25 AM

Le type PHP invite à améliorer la qualité et la lisibilité du code. 1) Conseils de type scalaire: Depuis PHP7.0, les types de données de base sont autorisés à être spécifiés dans les paramètres de fonction, tels que INT, Float, etc. 2) Invite de type de retour: Assurez la cohérence du type de valeur de retour de fonction. 3) Invite de type d'union: Depuis PHP8.0, plusieurs types peuvent être spécifiés dans les paramètres de fonction ou les valeurs de retour. 4) Invite de type nullable: permet d'inclure des valeurs nulles et de gérer les fonctions qui peuvent renvoyer les valeurs nulles.

Comment PHP gère le clonage des objets (mot-clé de clone) et la méthode de magie __clone?Comment PHP gère le clonage des objets (mot-clé de clone) et la méthode de magie __clone?Apr 17, 2025 am 12:24 AM

Dans PHP, utilisez le mot-clé Clone pour créer une copie de l'objet et personnalisez le comportement de clonage via la méthode de magie du clone \ _ \ _. 1. Utilisez le mot-clé Clone pour faire une copie peu profonde, en clonant les propriétés de l'objet mais pas aux propriétés de l'objet. 2. La méthode du clone \ _ \ _ peut copier profondément les objets imbriqués pour éviter les problèmes de copie superficiels. 3. Faites attention pour éviter les références circulaires et les problèmes de performance dans le clonage et optimiser les opérations de clonage pour améliorer l'efficacité.

PHP vs Python: cas d'utilisation et applicationsPHP vs Python: cas d'utilisation et applicationsApr 17, 2025 am 12:23 AM

PHP convient aux systèmes de développement Web et de gestion de contenu, et Python convient aux scripts de science des données, d'apprentissage automatique et d'automatisation. 1.Php fonctionne bien dans la création de sites Web et d'applications rapides et évolutifs et est couramment utilisé dans CMS tel que WordPress. 2. Python a permis de manière remarquable dans les domaines de la science des données et de l'apprentissage automatique, avec des bibliothèques riches telles que Numpy et Tensorflow.

Décrivez différents en-têtes de mise en cache HTTP (par exemple, contrôle du cache, ETAG, dernier modifié).Décrivez différents en-têtes de mise en cache HTTP (par exemple, contrôle du cache, ETAG, dernier modifié).Apr 17, 2025 am 12:22 AM

Les acteurs clés des en-têtes de cache HTTP incluent le contrôle du cache, l'ETAG et la dernière modification. 1.CACHE-Control est utilisé pour contrôler les politiques de mise en cache. Exemple: Cache-Control: Max-Age = 3600, public. 2. Etag vérifie les changements de ressources par le biais d'identifiants uniques, exemple: ETAG: "686897696A7C876B7E". 3.Last-modifié indique le dernier temps de modification de la ressource, exemple: dernier modifié: mer, 21oct201507: 28: 00gmt.

Expliquez le hachage de mot de passe sécurisé dans PHP (par exemple, Password_Hash, Password_verify). Pourquoi ne pas utiliser MD5 ou SHA1?Expliquez le hachage de mot de passe sécurisé dans PHP (par exemple, Password_Hash, Password_verify). Pourquoi ne pas utiliser MD5 ou SHA1?Apr 17, 2025 am 12:06 AM

Dans PHP, Password_Hash et Password_verify Les fonctions doivent être utilisées pour implémenter le hachage de mot de passe sécurisé, et MD5 ou SHA1 ne doit pas être utilisé. 1) Password_hash génère un hachage contenant des valeurs de sel pour améliorer la sécurité. 2) Password_verify Vérifiez le mot de passe et assurez-vous la sécurité en comparant les valeurs de hachage. 3) MD5 et SHA1 sont vulnérables et manquent de valeurs de sel, et ne conviennent pas à la sécurité de mot de passe moderne.

PHP: une introduction au langage des scripts côté serveurPHP: une introduction au langage des scripts côté serveurApr 16, 2025 am 12:18 AM

PHP est un langage de script côté serveur utilisé pour le développement Web dynamique et les applications côté serveur. 1.Php est un langage interprété qui ne nécessite pas de compilation et convient au développement rapide. 2. Le code PHP est intégré à HTML, ce qui facilite le développement de pages Web. 3. PHP traite la logique côté serveur, génère une sortie HTML et prend en charge l'interaction utilisateur et le traitement des données. 4. PHP peut interagir avec la base de données, traiter la soumission du formulaire et exécuter les tâches côté serveur.

PHP et le Web: explorer son impact à long termePHP et le Web: explorer son impact à long termeApr 16, 2025 am 12:17 AM

PHP a façonné le réseau au cours des dernières décennies et continuera de jouer un rôle important dans le développement Web. 1) PHP est originaire de 1994 et est devenu le premier choix pour les développeurs en raison de sa facilité d'utilisation et de son intégration transparente avec MySQL. 2) Ses fonctions principales incluent la génération de contenu dynamique et l'intégration à la base de données, ce qui permet au site Web d'être mis à jour en temps réel et affiché de manière personnalisée. 3) La large application et l'écosystème de PHP ont motivé son impact à long terme, mais il fait également face à des mises à jour de version et à des défis de sécurité. 4) Les améliorations des performances ces dernières années, telles que la sortie de PHP7, lui permettent de rivaliser avec les langues modernes. 5) À l'avenir, PHP doit faire face à de nouveaux défis tels que la conteneurisation et les microservices, mais sa flexibilité et sa communauté active le rendent adaptable.

Pourquoi utiliser PHP? Avantages et avantages expliquésPourquoi utiliser PHP? Avantages et avantages expliquésApr 16, 2025 am 12:16 AM

Les principaux avantages du PHP comprennent la facilité d'apprentissage, un soutien solide sur le développement Web, les bibliothèques et les cadres riches, les performances élevées et l'évolutivité, la compatibilité multiplateforme et la rentabilité. 1) Facile à apprendre et à utiliser, adapté aux débutants; 2) une bonne intégration avec les serveurs Web et prend en charge plusieurs bases de données; 3) ont des cadres puissants tels que Laravel; 4) Des performances élevées peuvent être obtenues grâce à l'optimisation; 5) prendre en charge plusieurs systèmes d'exploitation; 6) Open source pour réduire les coûts de développement.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Version crackée d'EditPlus en chinois

Version crackée d'EditPlus en chinois

Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

Navigateur d'examen sécurisé

Navigateur d'examen sécurisé

Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

SublimeText3 version anglaise

SublimeText3 version anglaise

Recommandé : version Win, prend en charge les invites de code !

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP