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
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
Réaliser le contrôle des autorisations de Spring Security basé sur le modèle de données RBAC
- Définir l'
RbacService
interface
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'
AuthorizeConfigProvider
interface
@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.
- Précédent: Spring Security (14): Réaliser une authentification unique SSO basée sur JWT
- Article suivant: Restez à l'écoute ~