Spring Security (15): contrôle des autorisations basé sur le modèle de données RBAC

Le document officiel de Spring Security présente ceci: Spring Security est un cadre d'authentification d'identité et de contrôle d'accès puissant et hautement personnalisable. Nous avons consacré plus d'une douzaine de pages à l'authentification et à l'autorisation, et une autre caractéristique importante est le contrôle d'accès. Dans cet article, nous parlerons de son contenu.

Contrôle d'accès

Concepts déroutants

  • Tout d'abord, et ce 前端功能权限控制n'est pas la même chose.
  • Autorisations des fonctions frontales Quels rôles ont quelles autorisations ne sont contrôlés qu'en fonction du fait que les boutons de page sont grisés ou s'il faut afficher certaines fonctions, et quelles fonctions sont disponibles dans différents rôles.
  • Et ce que nous expliquons dans cet article, 后台接口的访问权限控制c'est qu'il existe différentes restrictions d'autorisation pour différents rôles pour accéder à différentes interfaces au niveau du back-end.

Le contrôle d'autorisation impliqué dans l'article précédent

Par exemple

  • En fait, nous avons été exposés dès le début, par exemple, quelles interfaces sont accessibles sans se connecter (interface de connexion, etc.). Les éléments de configuration dans le fichier de configuration principal sont les suivants:
	.authorizeRequests()
		// 排除对 "/authentication/require" 和 "/meicloud-signIn.html" 等的身份验证
		.antMatchers("/authentication/require", securityProperties.getBrowser().getSignInPage(), "/code/*")
		.permitAll()
		// 表示所有请求
		.anyRequest()
		// 需要身份验证
		.authenticated()
		.and()

Expression d'autorisation

  • Ce qui précède .permitAll()représente l'expression d'autorisation, il existe de nombreuses expressions d'autorisation qui peuvent être utilisées comme suit
Expression d'autorisation Description
permitTous Indique que tout est autorisé, renvoie toujours vrai
Nier tous Signifie tout rejeter, toujours retourner faux
anonyme Renvoie true si l'utilisateur actuel est anonyme
souviens-toi de moi Renvoie true si l'utilisateur actuel est un utilisateur RememberMe
authentifié Renvoie true si l'utilisateur actuel n'est pas anonyme
entièrement authentifié Renvoie true si l'utilisateur actuel n'est ni anonyme ni utilisateur RememberMe
hasRole Renvoie true lorsque l'utilisateur dispose de l'autorisation spécifiée
hasAnyRole ([rôle1, rôle2]) Renvoie true lorsqu'il est utilisé pour avoir des autorisations de rôle
hasAuthority Renvoie true lorsque l'utilisateur dispose de l'autorisation spécifiée
hasAnyAuthority ([autorité1, autorité2]) Renvoie true lorsque l'utilisateur dispose de l'une des autorisations spécifiées
hasIpAddress ('192.168.1.0/24') Renvoie true lorsque l'Ip demandé correspond
  • Vous pouvez voir quelles expressions d'autorisation peuvent être utilisées dans le code
    Expression d'autorisation facultative

Contrôle d'autorité basé sur le modèle de données RBAC

  • Bien sûr, ce qui précède est seulement Spring Security提供的一些方便操作的权限控制表达式. Dans les projets réels, il existe différents rôles et différents rôles ont des autorisations différentes. Comment concevoir cette fois?

Modèle de données RBAC

  • Nom complet: Role-Based Access Control(contrôle d'accès basé sur les rôles)
  • Il y a généralement cinq tableaux 三张主体表(用户、角色、权限),两张关联表(用户-角色、角色-权限).
  • Diagramme
    Modèle de données RBAC

Réaliser le contrôle des autorisations de Spring Security basé sur le modèle de données RBAC

  • Définir l' RbacServiceinterface
public interface RbacService {
    
    
	boolean hasPermission(HttpServletRequest request, Authentication authentication);
}
  • Définissez sa classe d'implémentation RbacServiceImpl, en fait, toutes les autorisations de l'utilisateur actuel sont 在登录授权的时候设置进了authentication中.
@Component("rbacService")
public class RbacServiceImpl implements RbacService {
    
    

	private AntPathMatcher antPathMatcher = new AntPathMatcher();

	@Override
	public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
    
    
		Object principal = authentication.getPrincipal();
		boolean hasPermission = false;

		if (principal instanceof Admin) {
    
    
			// 如果用户名是admin,就永远返回true
			if (StringUtils.equals(((Admin) principal).getUsername(), "admin")) {
    
    
				hasPermission = true;
			} else {
    
    
				// 读取用户所拥有权限的所有URL
				Set<String> urls = ((Admin) principal).getUrls();
				for (String url : urls) {
    
    
					if (antPathMatcher.match(url, request.getRequestURI())) {
    
    
						hasPermission = true;
						break;
					}
				}
			}
		}
		return hasPermission;
	}
}
  • Appliquer dans Spring Security, créer une classe de configuration pour implémenter l' AuthorizeConfigProviderinterface
@Component
public class DemoAuthorizeConfigProvider implements AuthorizeConfigProvider {
    
    
	@Override
	public boolean config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
    
    
		//demo项目授权配置
		return false;
	}
}
  • En fait, il y a principalement deux points. Une chose à noter est que les autorisations du rôle de connexion doivent être interrogées et définies dans Authentification lors de la connexion. L'autre est d'écrire sur la façon d'intercepter les autorisations d'accès correspondant à différentes interfaces, et une Il est plus important de savoir comment Configurer dans Spring Security, le blogueur actuel utilise une version inférieure pour configurer de cette manière. La configuration de la version avancée devrait être beaucoup plus simple. L'utilisation de certaines annotations peut répondre à nos besoins. S'il reste du temps, une version d'entreprise peut être publié plus tard Schéma de contrôle et fonctionnement.

Je suppose que tu aimes

Origine blog.csdn.net/qq_36221788/article/details/106977555
conseillé
Classement