Spring Security (15): control de permisos basado en el modelo de datos RBAC

El documento oficial de Spring Security presenta esto: Spring Security es un marco de control de acceso y autenticación de identidad potente y altamente personalizable. Hemos dedicado más de una docena de páginas a la autenticación y autorización, y otra característica importante es el control de acceso. En este artículo hablaremos de su contenido.

Control de acceso

Conceptos confusos

  • Primero que nada, y 前端功能权限控制no es lo mismo.
  • Permisos de funciones de front-end Qué roles tienen qué permisos solo se controlan en términos de si los botones de la página están atenuados o si se muestran algunas funciones, y qué funciones están disponibles en diferentes roles.
  • Y lo que explicamos en este artículo es 后台接口的访问权限控制que existen diferentes restricciones de permisos para diferentes roles para acceder a diferentes interfaces en el nivel de back-end.

El control de permisos involucrado en el artículo anterior

Por ejemplo

  • De hecho, hemos sido expuestos desde el principio, por ejemplo, a qué interfaces se puede acceder sin iniciar sesión (interfaz de inicio de sesión, etc.). Los elementos de configuración en el archivo de configuración principal son los siguientes:
	.authorizeRequests()
		// 排除对 "/authentication/require" 和 "/meicloud-signIn.html" 等的身份验证
		.antMatchers("/authentication/require", securityProperties.getBrowser().getSignInPage(), "/code/*")
		.permitAll()
		// 表示所有请求
		.anyRequest()
		// 需要身份验证
		.authenticated()
		.and()

Expresión de permiso

  • Lo anterior .permitAll()representa la expresión de permiso, hay muchas expresiones de permiso que se pueden usar de la siguiente manera
Expresión de permiso Descripción
permitAll Indica que todo está permitido, siempre devuelve verdadero
negar todo Significa rechazar todo, siempre devolver falso
anónimo Devuelve verdadero si el usuario actual es anónimo
Recuérdame Devuelve verdadero si el usuario actual es un usuario de RememberMe
autenticado Devuelve verdadero si el usuario actual no es anónimo
totalmente autenticado Devuelve verdadero si el usuario actual no es anónimo ni es usuario RememberMe
hasRole Devuelve verdadero cuando el usuario tiene el permiso especificado.
hasAnyRole ([rol1, rol2]) Devuelve verdadero cuando se usa para tener permisos de rol
hasAuthority Devuelve verdadero cuando el usuario tiene el permiso especificado.
hasAnyAuthority ([autoridad1, autoridad2]) Devuelve verdadero cuando el usuario tiene alguno de los permisos especificados.
hasIpAddress ('192.168.1.0/24') Devuelve verdadero cuando coincide el IP solicitado
  • Puede ver qué expresiones de permisos se pueden usar en el código
    Expresión de permiso opcional

Control de autoridad basado en el modelo de datos RBAC

  • Por supuesto, lo anterior es solo Spring Security提供的一些方便操作的权限控制表达式. En los proyectos reales, hay varios roles y los diferentes roles tienen diferentes permisos ¿Cómo diseñar esta vez?

Modelo de datos RBAC

  • Nombre completo: Role-Based Access Control(control de acceso basado en roles)
  • Generalmente hay cinco tablas 三张主体表(用户、角色、权限),两张关联表(用户-角色、角色-权限).
  • Diagrama
    Modelo de datos RBAC

Realice el control de permisos de Spring Security basado en el modelo de datos RBAC

  • Definir la RbacServiceinterfaz
public interface RbacService {
    
    
	boolean hasPermission(HttpServletRequest request, Authentication authentication);
}
  • Defina su clase de implementación RbacServiceImpl, de hecho, todos los permisos del usuario actual son 在登录授权的时候设置进了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;
	}
}
  • Aplicar en Spring Security, crear una clase de configuración para implementar la AuthorizeConfigProviderinterfaz
@Component
public class DemoAuthorizeConfigProvider implements AuthorizeConfigProvider {
    
    
	@Override
	public boolean config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
    
    
		//demo项目授权配置
		return false;
	}
}
  • De hecho, hay principalmente dos puntos. Una cosa a tener en cuenta es que los permisos de la función de inicio de sesión deben consultarse y configurarse en Autenticación al iniciar sesión. El otro es escribir sobre cómo interceptar los permisos de acceso que coinciden con diferentes interfaces, y uno Más punto es cómo configurar Spring Security, el blogger actual usa una versión inferior para configurar de esta manera. La configuración de la versión avanzada debería ser mucho más simple. El uso de algunas anotaciones puede satisfacer nuestras necesidades. Si hay tiempo, una versión de la empresa puede se publicará posteriormente Esquema de control y funcionamiento.

Supongo que te gusta

Origin blog.csdn.net/qq_36221788/article/details/106977555
Recomendado
Clasificación