Use Casbin para realizar la autenticación RBAC en solicitudes http y agregue soporte para parámetros de enrutamiento de solicitudes

Tabla de contenido

Resumir

fondo

Práctico

Instalar Casbin

Crear un modelo Casbin

Crear una política de Casbin

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 objy 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 objy operación de la política act. Una definición de rol incluye dos atributos: nombre de rol gy miembro de rol _, donde _significa que el miembro de rol puede ser cualquier cadena. Usamos gpara 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 keyMatch2la función para hacer coincidir el objeto de la solicitud y el objeto de la política, y la operación de solicitudact 则必须完全匹配。

keyMatch2es 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, keyMatch2la 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/123y el objeto de política es /users/:id, entonces keyMatch2la función , porque el comodín puede coincidir con una cadena de cualquier longitud.

Además de keyMatch2la función , Casbin también admite otras funciones de coincidencia, como keyMatch, , regexMatchetc. 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 .memberzhangsanlisi

Entre ellos, adminel rol tiene derechos de acceso a todas las operaciones de solicitud en /deptsla ruta ; memberel rol solo /deptstiene /depts/:idderechos de acceso a las operaciones de solicitud GET en las rutas y; zhangsanel rol hereda adminlos derechos de acceso del rol, por lo que también tiene acceso a todas las solicitudes operaciones bajo /deptslos derechos de acceso de la ruta ; lisiun rol tiene solo los derechos de acceso de memberun 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.gollamado 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 Enforceel 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.

 
 

Supongo que te gusta

Origin blog.csdn.net/kingu_crimson/article/details/129816280
Recomendado
Clasificación