[Shiro] Chaîne d'autorisation et contenu associé de l'authentification et de l'autorisation

1. Chaîne d'autorisation

1. Formater

Resource:Permission:Operation
(le format courant est :Module :Fonction :Opération

  1. Ressources : fait référence aux objets, données ou services qui doivent être protégés dans le système. Une ressource peut être un terme général ou un objet spécifique.
  2. Autorisations : fait référence aux opérations ou fonctions sur les ressources , qui sont utilisées pour limiter l'accès et l'utilisation des ressources. La permission peut être un verbe ou un mot descriptif. Besoin de représenter exactement ce que fait ou fait l'autorisation.
  3. Opération : fait référence à l'exécution d' actions spécifiques correspondant à une certaine autorisation , telle que CRUD.

Les caractères génériques ( *) représentent un ou plusieurs.

Des caractères génériques simples peuvent également être utilisés, par exemple sys:user:*, il est recommandé d'omettre as sys:user(les astérisques ne peuvent pas être utilisés pour séparer le frontal).
L'exemple 1 correspondrasys:user avec succès à toutes les chaînes d'autorisation commençant par ou . L'exemple 2 correspondra avec succès à toutes les chaînes d'autorisation commençant par ousys:usersys:user:
syssyssys:

2. Exemples spécifiques

Module:Fonction:Opération
Exemple 1 : sys:user:editDéléguerModule système : Fonction utilisateur : Modifier l'opération
Exemple 2 : report:couponReceive:*ReprésentantModule de rapport : fonction de collecte des coupons : toutes les opérations

3. Autres séparateurs

  1. Utilisation de "/" comme séparateur
    Un chemin hiérarchique qui montre comment les autorisations sont réparties entre les ressources.
    Par exemple,posts/view/read

  2. L'utilisation de "." comme délimiteur
    est généralement appropriée pour les systèmes avec des hiérarchies d'objets ou de ressources bien définies, ce qui rend les autorisations plus semblables à des composants hiérarchiques ou à des espaces de noms.
    Par exemple,posts.view.read

Doute : Les 3 formes ci-dessus ( :, /, .), quel séparateur doit être utilisé dans le développement réel ?
Réponse : Compréhension personnelle , vous pouvez utiliser l'un ou l'autre, principalement en fonction de la façon dont le système a été défini au début, et vous pouvez utiliser celui que vous voulez.

2. Contenu pertinent de l'authentification et de l'autorisation

1. La différence entre l'autorité, l'URI et l'URL

  • Autorisation (permission) : parmi d'autres séparateurs, "/" est utilisé comme séparateur, ce qui est très similaire au style d'URL et d'URI, mais il est principalement utilisé comme une chaîne d'autorisations.
  • URI : identifie de manière unique une ressource.Dans filterChainDefinitionMap , l'URI peut être soit l'adresse de la requête backend , soit le chemin de la ressource statique

Caractères génériques d'URI :
1. ?: correspond à un caractère. 【Un caractère arbitraire】
2. *: Correspond à zéro ou plusieurs chaînes de caractères. 【Chemin arbitraire】
3.** : Faites correspondre zéro ou plusieurs chemins dans le chemin. 【Chemin et sous-chemin arbitraires】

Avis:

Ce qui est écrit ci-dessus est URI (uniform resource identifier) ​​, pas URL (uniform resource locator) . Il y a une différence entre les deux :
URL est un URI spécifique, qui est un sous-ensemble d'URI. Il identifie non seulement les ressources de manière unique, mais également Fournit des informations pour localiser cette ressource. L'URI est un concept sémantique abstrait, qui peut être absolu ou relatif, tandis que l'URL doit fournir suffisamment d'informations pour être localisée et est absolue.

Autrement dit :
URI : numéro d'identification (vous pouvez seulement savoir qu'il existe une telle personne, mais vous ne savez pas qui c'est)
URL : adresse d'identification + nom (non seulement savoir qui est cette personne, mais aussi la trouver)
comme tant qu'il peut représenter la ressource de manière unique. Il s'agit de l'URI, et la méthode d'accès à ses ressources est donnée sur la base de l'URI est l'URL.
La référence ci-dessus :
la différence et la connexion entre l'URI et l'URL

Dans le développement réel, la permission (permission) et l'URI sont utilisées en combinaison.

@Bean
public FilterChainDefinitionMap createFilterChainDefinitionMap() {
    
    
    Map<String, String> filterChainMap = new LinkedHashMap<>();
    filterChainMap.put("/public/**", "anon");
    filterChainMap.put("/admin/**", "authc,roles[admin]");
    filterChainMap.put("/**", "authc");
    return new DefaultFilterChainDefinitionMap(filterChainMap);
}

Dans l'exemple ci-dessus, nous définissons l'URI sous /public/**le chemin pour qu'il soit accessible sans authentification ( anon), définissons l'URI sous le chemin
pour exiger une authentification et une autorisation d'accès ( ), et définissons l'URI sous tous les autres chemins pour exiger L'authentification est requise pour accès ( )./admin/**adminauthc,roles[admin]
authc

2. Nom du filtre d'authentification et d'autorisation

1. Nom du filtre d'authentification

  • anon: Indique que vous pouvez accéder aux ressources sans vous connecter
  • user: Indique que les utilisateurs doivent se connecter pour accéder aux ressources, et ne pas vérifier lors de la connexion ()
  • authc: Indique que l'authentification de connexion est requise pour accéder aux ressources, généralement utilisée pour les interfaces de connexion

2. Nom du filtre d'autorisation

  • perms: Par exemple /public/**=perms[user:add:*], plusieurs paramètres peuvent être écrits et des guillemets doivent être ajoutés lorsqu'il y a plusieurs paramètres, et les paramètres doivent être séparés par des virgules. Par exemple, lorsqu'il y a /public/**=perms["user:add:*,user:modify:*"]plusieurs paramètres, chaque paramètre doit être transmis avant de passer, ce qui est équivalent à la méthode isPermitedAll().
  • roles: Par exemple /admin/**=roles[admin], plus d'un paramètre peut être écrit, et des guillemets doivent être ajoutés lorsqu'il y en a plusieurs, et les paramètres doivent être séparés par des virgules. Lorsqu'il y a plusieurs paramètres, par exemple, chaque paramètre est passé, ce qui /admin/**=roles["admin,guest"]est équivalent à la méthode hasAllRoles().

3. Méthode d'autorisation

Il existe 4 types principaux :

  • Programmatique : fait avec des blocs de code if/else.
  • Annotation : elle est complétée en plaçant les annotations correspondantes sur la méthode exécutée, et une exception correspondante sera levée s'il n'y a pas d'autorisation.
  • Page de visualisation : Elle est complétée par les balises correspondantes dans la page de visualisation (Beetl/JSP).
  • Interception basée sur l'URI : déterminez les droits d'accès en fonction de la correspondance d'URI.

Ce qui suit présente principalement l'annotation et l'interception basée sur l'URI.

1. Programmatique (spécifique aux données)

Scénario : la modification et l'audit partagent une ressource. Vous pouvez déterminer si vous disposez d'un droit d'audit sur la ressource, puis effectuer l'opération correspondante.
Exemple d'application spécifique : si l'utilisateur a le droit d'utiliser un certain élément ou type de données dans la liste

Subject subject = UserUtils.getSubject();
subject.isAuthenticated();            // 是否身份验证授权通过
subject.isPermitted(permission);      // 验证权限字符串
subject.isPermittedAll(permissions);  // 验证权限字符串全部通过
subject.hasRole(roleIdentifier);      // 验证是否有角色权限

2. Annotation (à grain fin)

Scénario : Effectuez un filtrage des autorisations sur les ressources URL, les boutons et d'autres opérations. Si l'utilisateur ignore la vérification de l'interface, l'accès direct à l'adresse URL nécessite également une vérification des autorisations.
Par exemple : l'utilisateur a le droit de gestion des utilisateurs (mais ne précise pas quels utilisateurs sont gérés)
Exemple d'application spécifique : si l'utilisateur courant a le droit d'ajouter des utilisateurs (s'il peut demander d'ajouter une interface)

Spécifiez les annotations suivantes sur la méthode Controller :

  • @RequiresPermissions (value={“sys:user:view”, “sys:user:edit”}, logical= Logical.OR): indique que le sujet actuel a besoin de l'autorisation user:view ou user:edit.
  • @RequiresRoles(value={“admin”, “user”}, logical=Logical.AND) : Indique que le sujet actuel nécessite les rôles d'administrateur et d'utilisateur
  • @RequiresAuthentication: indique que le sujet actuel a été authentifié via la connexion ;
  • @RequiresUser: Indique que le sujet actuel a été authentifié ou connecté en se souvenant de moi.
  • @RequiresGuest: Indique que le sujet actuel n'a pas de vérification d'identité ou se souvient que je me suis connecté, c'est-à-dire qu'il s'agit d'une identité de touriste.

3. Interception basée sur l'URI (gros grain)

Scénario : Lorsqu'il n'est pas pratique d'utiliser la programmation, l'annotation, etc. pour filtrer les autorisations, vous pouvez utiliser l'URI pour contrôler les autorisations ou contrôler globalement les autorisations d'une adresse URI. Par exemple : les utilisateurs ne sont autorisés à modifier que le service A (les utilisateurs
dans les départements B et C ne peuvent pas être modifiés)
Exemple d'application spécifique : déterminer si le sujet en cours a la permission d'accéder à certaines pages

Format :
URI地址及通配符 = 过滤器名称(支持多个,用英文逗号分隔并加双引号)
la configuration de définition de filtre d'autorisation ci-dessus est basée sur le principe de priorité de première correspondance de haut en bas, et les URI qui correspondent avec succès sont prioritaires et les caractères génériques sont pris en charge.

3. Supplément : que sont les autorisations grossières et fines ?

  • Grossier : la gestion des types de ressources est appelée contrôle d'autorisation grossier, c'est-à-dire qu'elle ne contrôle que les menus, les boutons et les méthodes.
  • Affiné : le contrôle des instances de ressources est appelé gestion affinée des droits, c'est-à-dire les droits contrôlés au niveau des données.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42516475/article/details/130559783
conseillé
Classement