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
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
Realice el control de permisos de Spring Security basado en el modelo de datos RBAC
- Definir la
RbacService
interfaz
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
AuthorizeConfigProvider
interfaz
@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.
- Previous: Spring Security (14): Realice el inicio de sesión único SSO basado en JWT
- Artículo siguiente: Estén atentos ~