Tabla de contenido
Cargue el modelo y la política de Casbin y cree una ruta
Resumir
En este artículo, presentaremos cómo usar Casbin para realizar la autenticación de control de acceso basado en roles (RBAC) en solicitudes HTTP y admitir parámetros de enrutamiento de solicitudes. Usaremos la biblioteca Casbin en el lenguaje Go.
fondo
Casbin es una biblioteca que admite modelos de control de acceso y se puede integrar fácilmente en su aplicación. Admite múltiples modelos de control de acceso, incluidos RBAC, ABAC, etc., y se puede integrar con varios repositorios de back-end (como archivos, bases de datos, etc.) para facilitar la gestión de las políticas de control de acceso.
En este artículo, usaremos Casbin para implementar el control de acceso basado en RBAC y proporcionar soporte de autenticación para solicitudes HTTP.
Práctico
Instalar Casbin
Primero, necesitamos instalar la biblioteca Casbin. Puedes instalarlo con el siguiente comando:
go get -u github.com/casbin/casbin
Crear un modelo Casbin
En Casbin, los modelos se utilizan para definir políticas de acceso, incluidos roles, recursos y operaciones. Aquí hay un ejemplo de un modelo Casbin simple:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && r.act == p.act
En el modelo Casbin anterior, definimos solicitudes, políticas, roles y comparadores para el control de acceso. Específicamente, una definición de solicitud incluye tres atributos: cuerpo de solicitud sub
, objeto de solicitud obj
y operación de solicitud act
. La definición de la política es similar a la definición de la solicitud, e incluye tres atributos: sujeto de la política sub
, objeto de la política obj
y operación de la política act
. Una definición de rol incluye dos atributos: nombre de rol g
y miembro de rol _
, donde _
significa que el miembro de rol puede ser cualquier cadena. Usamos g
para definir la relación jerárquica entre roles. Los emparejadores definen cómo se emparejan las solicitudes y las políticas.
En pocas palabras, sub
el asunto de la solicitud debe heredar sub
el asunto de la política, usamos keyMatch2
la función para hacer coincidir el objeto de la solicitud y el objeto de la política, y la operación de solicitudact 则必须完全匹配。
keyMatch2
es una función de coincidencia en Casbin, que se utiliza para hacer coincidir cadenas con comodines en objetos de solicitud y objetos de política.
Específicamente, keyMatch2
la función admite los dos puntos comodín ( :
), que pueden coincidir con cadenas de cualquier longitud. Por ejemplo, supongamos que tenemos un objeto de solicitud /users/123
y el objeto de política es /users/:id
, entonces keyMatch2
la función , porque el comodín : puede coincidir con una cadena de cualquier longitud.
Además de keyMatch2
la función , Casbin también admite otras funciones de coincidencia, como keyMatch
, , regexMatch
etc. Estas funciones coincidentes pueden ayudarnos a definir políticas de control de acceso de manera más flexible para adaptarse a diferentes escenarios comerciales. Referencia específica:
casbin - función en emparejadores
Crear una política de Casbin
En Casbin, las políticas se utilizan para definir las reglas de control de acceso reales. Puede almacenar políticas en diferentes backends, como bases de datos o archivos. Aquí hay un ejemplo de una política Casbin simple:
p, member, /depts, GET
p, member, /depts/:id, GET
p, admin, /depts, POST
p, admin, /depts/:id, PUT
p, admin, /depts/:id, DELETE
g, admin, member
g, zhangsan, admin
g, lisi, member
En la estrategia de Casbin anterior, en realidad definimos cuatro roles: admin
, y .member
zhangsan
lisi
Entre ellos, admin
el rol tiene derechos de acceso a todas las operaciones de solicitud en /depts
la ruta ; member
el rol solo /depts
tiene /depts/:id
derechos de acceso a las operaciones de solicitud GET en las rutas y; zhangsan
el rol hereda admin
los derechos de acceso del rol, por lo que también tiene acceso a todas las solicitudes operaciones bajo /depts
los derechos de acceso de la ruta ; lisi
un rol tiene solo los derechos de acceso de member
un rol .
Además, usamos dos puntos ( :
) para representar los parámetros de la ruta, lo que indica que el objeto de la solicitud puede ser una ruta con parámetros. De esta forma, podemos definir políticas de control de acceso de manera más flexible para adaptarnos a diferentes escenarios comerciales.
Cargue el modelo y la política de Casbin y cree una ruta
A continuación, crearemos un archivo Go main.go
llamado y agregaremos el siguiente código:
package main
import (
"github.com/casbin/casbin"
"log"
"net/http"
)
func main() {
// 创建 Casbin 模型
e := casbin.NewEnforcer("model.conf", "policy.csv")
// 创建 HTTP 处理程序
http.HandleFunc("/depts/", func(w http.ResponseWriter, r *http.Request) {
// 获取当前用户、请求路径和请求方法
user := r.Header.Get("X-User")
path := r.URL.Path
method := r.Method
// 检查当前用户是否有权限访问该路径
if !e.Enforce(user, path, method) {
http.Error(w, "Forbidden", http.StatusForbidden)
return
}
// 如果有权限,则继续处理请求
// TODO: 处理请求
})
// 启动 HTTP 服务器
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
En el código anterior, primero creamos un modelo Casbin y un controlador HTTP /depts/
llamado . En el controlador, obtenemos el usuario actual, la ruta de solicitud y el método de solicitud, y usamos Enforce
el método para verificar si el usuario actual tiene permiso para acceder a la ruta. Si no está autorizado, se devuelve el código de estado HTTP 403.
Ahora podemos ejecutar la aplicación con el siguiente comando:
go run main.go
Ahora, hemos implementado con éxito el control de acceso basado en RBAC, brindando soporte de autenticación para solicitudes HTTP. Sin embargo, es posible que deseemos admitir parámetros de enrutamiento de solicitudes para una mayor flexibilidad en la definición de políticas de control de acceso.