Maison développement back-end tutoriel php Manuel d'utilisation d'Apache Shiro (3) Autorisation Shiro

Manuel d'utilisation d'Apache Shiro (3) Autorisation Shiro

Jan 18, 2017 am 09:27 AM
apache 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? 

}
Copier après la connexion



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();
Copier après la connexion
Méthode du sujet                                                                                                                                                                              🎜>checkRoles(Collection< String> 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&#39;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&#39;t show the button? Grey it out? 

}
Copier après la connexion
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&#39;t show the button? Grey it out? 

}
Copier après la connexion

使用冒号分隔的权限表达式是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();
Copier après la connexion

基于字符串的断言实现

Subject currentUser = SecurityUtils.getSubject(); 

//guarantee that the current user is permitted 

//to open a bank account: 

currentUser.checkPermission("account:open"); 

openBankAccount();
Copier après la connexion

断言实现的相关方法

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
Copier après la connexion

表明该用户需为”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
Copier après la connexion

当前用户需拥有制定角色

@ RequiresUser

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

3、基于JSP TAG的授权实现

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

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

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
Copier après la connexion

下面一一介绍Shiro的标签:

guest标签

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

<shiro:guest> 

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

</shiro:guest>
Copier après la connexion

user标签

认证通过或已记住的用户

<shiro:user> 

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

</shiro:user>
Copier après la connexion

authenticated标签

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

<shiro:authenticated> 

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

</shiro:authenticated> 

notAuthenticated标签
Copier après la connexion

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

<shiro:notAuthenticated> 

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

</shiro:notAuthenticated>
Copier après la connexion

principal 标签

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

Hello, <shiro:principal/>, how are you today?
Copier après la connexion

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

<shiro:hasRole name="administrator"> 

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

</shiro:hasRole>
Copier après la connexion

lacksRole标签

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

<shiro:lacksRole name="administrator"> 

Sorry, you are not allowed to administer the system. 

</shiro:lacksRole>
Copier après la connexion

hasAnyRole标签

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

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

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

</shiro:lacksRole>
Copier après la connexion

hasPermission标签

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

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

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

</shiro:hasPermission>
Copier après la connexion
Copier après la connexion

lacksPermission标签

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

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

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

</shiro:hasPermission>
Copier après la connexion
Copier après la connexion

三、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 de ce site Web
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

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)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comparaison des performances du framework PHP : la confrontation ultime entre vitesse et efficacité. Comparaison des performances du framework PHP : la confrontation ultime entre vitesse et efficacité. Apr 30, 2024 pm 12:27 PM

Selon les benchmarks, Laravel excelle dans la vitesse de chargement des pages et les requêtes de bases de données, tandis que CodeIgniter excelle dans le traitement des données. Lorsque vous choisissez un framework PHP, vous devez tenir compte de la taille de l'application, des modèles de trafic et des compétences de l'équipe de développement.

Comment effectuer des tests de concurrence et le débogage dans la programmation simultanée Java ? Comment effectuer des tests de concurrence et le débogage dans la programmation simultanée Java ? May 09, 2024 am 09:33 AM

Tests de concurrence et débogage Les tests de concurrence et le débogage dans la programmation simultanée Java sont cruciaux et les techniques suivantes sont disponibles : Tests de concurrence : tests unitaires : isolez et testez une seule tâche simultanée. Tests d'intégration : tester l'interaction entre plusieurs tâches simultanées. Tests de charge : évaluez les performances et l'évolutivité d'une application sous une charge importante. Débogage simultané : points d'arrêt : suspendez l'exécution du thread et inspectez les variables ou exécutez le code. Journalisation : enregistrez les événements et l'état du fil. Trace de pile : identifiez la source de l’exception. Outils de visualisation : surveillez l'activité des threads et l'utilisation des ressources.

Le module évasif protège votre site Web des attaques DOS de la couche application Le module évasif protège votre site Web des attaques DOS de la couche application Apr 30, 2024 pm 05:34 PM

Il existe une variété de méthodes d’attaque qui peuvent mettre un site Web hors ligne, et les méthodes les plus complexes impliquent des connaissances techniques en bases de données et en programmation. Une méthode plus simple est appelée attaque « DenialOfService » (DOS). Le nom de cette méthode d'attaque vient de son intention : faire refuser les demandes de service normales des clients ordinaires ou des visiteurs du site Web. De manière générale, il existe deux formes d'attaques DOS : les troisième et quatrième couches du modèle OSI, c'est-à-dire l'attaque de la couche réseau. La septième couche du modèle OSI, c'est-à-dire l'attaque de la couche application. attaque - la couche réseau, se produit lorsqu'un grand nombre de trafic indésirable circule vers le serveur Web. Lorsque le trafic de spam dépasse la capacité du réseau à le gérer, le site Web tombe en panne. Le deuxième type d'attaque DOS concerne la couche application et utilise des

Comment ajouter un serveur dans Eclipse Comment ajouter un serveur dans Eclipse May 05, 2024 pm 07:27 PM

Pour ajouter un serveur à Eclipse, procédez comme suit : Créer un environnement d'exécution du serveur Configurer le serveur Créer une instance de serveur Sélectionner l'environnement d'exécution du serveur Configurer l'instance de serveur Démarrer le projet de déploiement du serveur

Application d'algorithmes dans la construction de 58 plateformes de portraits Application d'algorithmes dans la construction de 58 plateformes de portraits May 09, 2024 am 09:01 AM

1. Contexte de la construction de la plateforme 58 Portraits Tout d'abord, je voudrais partager avec vous le contexte de la construction de la plateforme 58 Portraits. 1. La pensée traditionnelle de la plate-forme de profilage traditionnelle ne suffit plus. La création d'une plate-forme de profilage des utilisateurs s'appuie sur des capacités de modélisation d'entrepôt de données pour intégrer les données de plusieurs secteurs d'activité afin de créer des portraits d'utilisateurs précis. Elle nécessite également l'exploration de données pour comprendre le comportement et les intérêts des utilisateurs. et besoins, et fournir des capacités côté algorithmes ; enfin, il doit également disposer de capacités de plate-forme de données pour stocker, interroger et partager efficacement les données de profil utilisateur et fournir des services de profil. La principale différence entre une plate-forme de profilage d'entreprise auto-construite et une plate-forme de profilage de middle-office est que la plate-forme de profilage auto-construite dessert un seul secteur d'activité et peut être personnalisée à la demande. La plate-forme de mid-office dessert plusieurs secteurs d'activité et est complexe ; modélisation et offre des fonctionnalités plus générales. 2.58 Portraits d'utilisateurs de l'arrière-plan de la construction du portrait sur la plate-forme médiane 58

Comment déployer et maintenir un site Web en utilisant PHP Comment déployer et maintenir un site Web en utilisant PHP May 03, 2024 am 08:54 AM

Pour déployer et maintenir avec succès un site Web PHP, vous devez effectuer les étapes suivantes : Sélectionnez un serveur Web (tel qu'Apache ou Nginx) Installez PHP Créez une base de données et connectez PHP Téléchargez le code sur le serveur Configurez le nom de domaine et la maintenance du site Web de surveillance DNS les étapes comprennent la mise à jour de PHP et des serveurs Web, la sauvegarde du site Web, la surveillance des journaux d'erreurs et la mise à jour du contenu.

Comment utiliser Fail2Ban pour protéger votre serveur contre les attaques par force brute Comment utiliser Fail2Ban pour protéger votre serveur contre les attaques par force brute Apr 27, 2024 am 08:34 AM

Une tâche importante pour les administrateurs Linux est de protéger le serveur contre les attaques ou les accès illégaux. Par défaut, les systèmes Linux sont livrés avec des pare-feu bien configurés, tels que iptables, Uncomplicated Firewall (UFW), ConfigServerSecurityFirewall (CSF), etc., qui peuvent empêcher diverses attaques. Toute machine connectée à Internet est une cible potentielle d'attaques malveillantes. Il existe un outil appelé Fail2Ban qui peut être utilisé pour atténuer les accès illégaux sur le serveur. Qu’est-ce que Fail2Ban ? Fail2Ban[1] est un logiciel de prévention des intrusions qui protège les serveurs des attaques par force brute. Il est écrit en langage de programmation Python

Comment implémenter les meilleures pratiques de sécurité PHP Comment implémenter les meilleures pratiques de sécurité PHP May 05, 2024 am 10:51 AM

Comment mettre en œuvre les meilleures pratiques de sécurité PHP PHP est l'un des langages de programmation Web backend les plus populaires utilisés pour créer des sites Web dynamiques et interactifs. Cependant, le code PHP peut être vulnérable à diverses failles de sécurité. La mise en œuvre des meilleures pratiques de sécurité est essentielle pour protéger vos applications Web contre ces menaces. Validation des entrées La validation des entrées est une première étape essentielle pour valider les entrées utilisateur et empêcher les entrées malveillantes telles que l'injection SQL. PHP fournit une variété de fonctions de validation d'entrée, telles que filter_var() et preg_match(). Exemple : $username=filter_var($_POST['username'],FILTER_SANIT

See all articles