Maison > développement back-end > Golang > Comment configurer l'autorisation dans un système de gestion de librairie avec Go, HTMX et Permit.io

Comment configurer l'autorisation dans un système de gestion de librairie avec Go, HTMX et Permit.io

Mary-Kate Olsen
Libérer: 2024-12-01 02:08:10
original
397 Les gens l'ont consulté

L'autorisation est importante lors de la création d'applications, car elle détermine les actions et les ressources auxquelles un utilisateur est autorisé à accéder après son authentification.

Dans cet article, nous verrons comment implémenter l'autorisation à l'aide de permit.io. Pour le démontrer, nous allons créer une application de librairie simple en utilisant Golang et HTMX (je suis un grand fan).

Conditions préalables

Pour suivre ce tutoriel, les prérequis suivants doivent être remplis :

  • Golang installé avec une compréhension de base de celui-ci.
  • Un compte Permit.io.
  • Docker installé.
  • Compréhension de base des API HTML, HTTP et REST.
  • PostgreSQL (base de données).
  • Connaissance de SQL.

Portée du projet

  • Pour cette démonstration, nous allons garder les choses simples. Nous aurons deux types d'utilisateurs, un administrateur et un utilisateur standard. Les deux seront enregistrés sur Permit.io. Lors de la connexion, la base de données consultera Permit.io pour déterminer le rôle de l'utilisateur et autoriser ses actions.

Tous les utilisateurs (administrateurs inclus) peuvent lire des livres. Les administrateurs peuvent également ajouter, supprimer et mettre à jour des livres. Les utilisateurs standard sont limités à la lecture de livres.

Ce tutoriel vous guidera dans la mise en place d'une application de librairie avec une autorisation de base. Nous mettrons en œuvre :

  • Logique d'autorisation : Définissez les rôles (administrateur et utilisateur standard) à l'aide de Permit.io pour restreindre ou accorder l'accès à différentes ressources.

  • Base de données : Configurez une base de données PostgreSQL pour stocker les données des livres et des utilisateurs.

  • Gestionnaires : Implémentez des itinéraires pour afficher, ajouter, mettre à jour et supprimer des livres avec des contrôles de contrôle d'accès.

  • Frontend : Utilisez HTMX pour charger les données du livre de manière dynamique.

Configuration du projet

Dans la mise en place du projet, nous commencerons par configurer permit.io. Accédez à l'espace de travail de votre tableau de bord et créez un nouveau projet. Je donnerai au mien le nom de la librairie.

How to Set Up Authorization in a Bookstore Management System with Go, HTMX, and Permit.io

Cela créera deux environnements : un environnement de développement et un environnement de production.

How to Set Up Authorization in a Bookstore Management System with Go, HTMX, and Permit.io

Puisque nous travaillons localement, nous utiliserons l’environnement de développement. Cliquez sur Ouvrir le tableau de bord dans l'environnement de développement puis sur Créer une politique. Il vous sera d’abord demandé de créer une nouvelle ressource. Cliquez sur créer une ressource. Donnez-lui un nom et indiquez les actions. Pour ce projet, je nommerai mes livres, et l'action sera de créer, mettre à jour, supprimer et afficher.

How to Set Up Authorization in a Bookstore Management System with Go, HTMX, and Permit.io

Ensuite, accédez à la section de l'éditeur de stratégie. Par défaut, vous devriez voir un rôle d'administrateur déjà créé. Il vous suffit de cocher l'action d'affichage que nous avons ajoutée, car elle n'est pas reconnue par défaut. Vous avez besoin d'un autre rôle. Ce sera destiné aux utilisateurs ayant uniquement l'autorisation de lire.

Cliquez sur Créer puis sur Rôle et donnez-lui le nom d'utilisateur. Une fois créé, vous devriez le voir dans l'éditeur de stratégie et cocher la vue dans le rôle d'utilisateur que vous venez de créer comme ceci :

How to Set Up Authorization in a Bookstore Management System with Go, HTMX, and Permit.io

La prochaine étape est d'enregistrer les utilisateurs qui seraient autorisés par permit.io. Revenez à votre menu d'accueil via le menu de la barre latérale, vous devriez toujours avoir quelque chose comme ceci :

How to Set Up Authorization in a Bookstore Management System with Go, HTMX, and Permit.io

Cliquez sur Ajouter des utilisateurs puis ajoutez, puis ajoutez un utilisateur. Remplissez les détails qui correspondront à vos utilisateurs dans la base de données.

Une fois cela fait, revenez à votre projet. Dans le projet Développement Pour l'environnement de la librairie, cliquez sur l'icône à 3 points. Vous verrez une option pour copier la clé API. Copiez-le et enregistrez-le quelque part, car vous en aurez besoin pour le projet.

Configurer la base de données

Créez une base de données PostgreSQL appelée librairie. Vous devrez dresser deux tables :

  • table des utilisateurs : stocke les informations d'identification et les rôles des utilisateurs :
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Allez-y et remplissez-le, mais faites en sorte que chaque utilisateur ait respectivement un rôle d'administrateur et d'utilisateur, et assurez-vous qu'il correspond aux utilisateurs ajoutés sur Permit.io.

  • table des livres : stocke les détails du livre :
CREATE TABLE books (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  title VARCHAR(255) NOT NULL,
  author VARCHAR(255) NOT NULL,
  published_at DATE,
  created_at TIMESTAMPTZ DEFAULT now()
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Vous n'avez pas besoin de renseigner ceci, nous le ferons dans le code.

Installer les dépendances

Vous devrez installer les dépendances suivantes :

  • github.com/permitio/permit-golang : Fournit des outils pour gérer le contrôle d'accès basé sur les rôles (RBAC) et la gestion des autorisations avec Permit.io dans les applications Go.

  • github.com/google/uuid : Cela fournit des fonctions pour générer et utiliser des identifiants universellement uniques (UUID).

  • github.com/gorilla/mux : Aide à implémenter un routeur et un répartiteur de requêtes HTTP pour gérer les itinéraires dans une application Web.

  • github.com/joho/godotenv: Cela charge les variables d'environnement à partir d'un .env. fichier dans l'application, ce qui facilite la gestion des paramètres de configuration.

  • github.com/lib/pq : Il s'agit du pilote Postgres de Go pour communiquer avec les bases de données PostgreSQL.

  • golang.org/x/crypto : Implémente des algorithmes et des bibliothèques cryptographiques supplémentaires qui ne sont pas inclus dans la bibliothèque standard de Go.

Pour installer ces dépendances, vous devez initialiser un nouveau module Go. C'est le point de départ de la gestion des dépendances dans Go.

Exécutez cette commande :

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, exécutez cette commande :

CREATE TABLE books (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  title VARCHAR(255) NOT NULL,
  author VARCHAR(255) NOT NULL,
  published_at DATE,
  created_at TIMESTAMPTZ DEFAULT now()
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela installera toutes les dépendances répertoriées ci-dessus.

Configurez votre conteneur PDP (Policy Decision Point)

Pour configurer le PDP, vous devrez démarrer Docker. Une fois que vous l'avez fait, ouvrez votre terminal et exécutez cette commande :

go mod init bookstore
Copier après la connexion
Copier après la connexion
Copier après la connexion

Après quoi vous devez exécuter le conteneur avec cette commande :

go get github.com/google/uuid \
       github.com/gorilla/mux \
       github.com/joho/godotenv \
       github.com/lib/pq \
       github.com/permitio/permit-golang \
       golang.org/x/crypto
Copier après la connexion
Copier après la connexion

Remplacez la pièce qui dit avec votre clé API réelle. Maintenant, commençons à construire.

Créer l'application

Pour construire l'application, voici comment sera la structure de notre projet :

docker pull permitio/pdp-v2:latest
Copier après la connexion

Ajoutons d'abord notre clé API dans un fichier .env. Créez-en un, puis votre clé API d'autorisation comme ceci :

 docker run -it -p 7766:7000 --env PDP_DEBUG=True --env PDP_API_KEY=<YOUR_API_KEY> permitio/pdp-v2:latest
Copier après la connexion

Configurer la connexion à la base de données

Créez un dossier appelé config. À l’intérieur, créez un fichier appelé config.go. Ajoutez le code suivant :

Bookstore                
├── config               
│   └── config.go        
│
├── handlers             
│   └── handlers.go      
│
├── middleware           
│   └── middleware.go    
│
├── models               
│   └── models.go        
│
├── templates            
│   ├── add.html         
│   ├── books.html       
│   ├── index.html       
│   ├── layout.html      
│   ├── login.html       
│   └── update.html      
│
├── main.go              
└── .env
Copier après la connexion

Il s'agit simplement de la configuration d'une configuration pour se connecter à une base de données PostgreSQL.

Créer les gestionnaires

Ensuite, créez un dossier appelé handlers, et à l'intérieur, créez un fichier appelé handlers.go. À l'intérieur, ajoutez le code suivant :

export PERMIT_API_KEY=”your_api_key”
Copier après la connexion

En plus d'importer les packages, ce que nous essayons de faire ici est de créer une structure qui contient la connexion à la base de données et permit.io. Nous fournissons également une fonction d'initialisation qui configure Permit.io avec un PDP local.

Juste après les NewHandlers, ajoutez ceci :

package config

import (
  "database/sql"
  "fmt"

  _ "github.com/lib/pq"
)

type Config struct {
  DB       *sql.DB
  Port     string
  DBConfig PostgresConfig
}

type PostgresConfig struct {
  Host     string
  Port     string
  User     string
  Password string
  DBName   string
}

func NewConfig() *Config {
  return &Config{
    Port: "8080",
    DBConfig: PostgresConfig{
      Host:     "localhost",
      Port:     "5432",
      User:     "bookstore_user",
      Password: "your_password",
      DBName:   "bookstore_db",
    },
  }
}

func (c *Config) ConnectDB() error {
  connStr := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
    c.DBConfig.Host,
    c.DBConfig.Port,
    c.DBConfig.User,
    c.DBConfig.Password,
    c.DBConfig.DBName,
  )

  db, err := sql.Open("postgres", connStr)
  if err != nil {
    return fmt.Errorf("error opening database: %v", err)
  }

  if err := db.Ping(); err != nil {
    return fmt.Errorf("error connecting to database: %v", err)
  }

  c.DB = db
  return nil
}
Copier après la connexion

Le LoginHandler effectue les opérations suivantes :

  • Gère à la fois GET (afficher le formulaire de connexion) et POST (processus de connexion).
  • Authentifie les utilisateurs par rapport à la base de données.
  • Définit les cookies de session pour les utilisateurs authentifiés.
  • Synchronise les données utilisateur avec Permit.io pour l'autorisation.
  • Rend les modèles appropriés en fonction du succès/de l'échec de la connexion.

L'étape suivante consiste à ajouter un gestionnaire de livres pour accéder aux livres. Il utilisera également permit.io pour vérifier le rôle de l'utilisateur. Ajoutez le code suivant juste après le LoginHandler :

package handlers

import (
  "bookstore/middleware"
  "bookstore/models" 
  "context"
  "database/sql"
  "fmt"
  "html/template"
  "net/http"
  "strings"
  "time"

  "github.com/google/uuid"
  "github.com/permitio/permit-golang/pkg/config"
  "github.com/permitio/permit-golang/pkg/enforcement"
  permitModels "github.com/permitio/permit-golang/pkg/models"
  "github.com/permitio/permit-golang/pkg/permit"
)

var tmpl = template.Must(template.ParseGlob("templates/*.html"))

func StringPtr(s string) *string {
  return &s
}

type Handlers struct {
  db           *sql.DB
  permitClient *permit.Client
}

func NewHandlers(db *sql.DB, apiKey string) *Handlers {
  permitConfig := config.NewConfigBuilder(apiKey).
    WithPdpUrl("http://localhost:7766").
    Build()
  permitClient := permit.NewPermit(permitConfig)
  if permitClient == nil {
    panic("Failed to initialize Permit.io client")
  }

  return &Handlers{
    db:           db,
    permitClient: permitClient,
  }
}
Copier après la connexion

Le BookHandler effectue les opérations suivantes :

  • Vérifie l'authentification des utilisateurs via les cookies.
  • Vérifie le rôle et les autorisations de l'utilisateur à l'aide de Permit.io.
  • Récupère les livres de la base de données si autorisé.
  • Rend le modèle de livres avec les données récupérées.
  • Gère les échecs d'autorisation de manière appropriée.

Ensuite, vous avez besoin d'un gestionnaire pour ajouter des livres. Il vérifiera également le rôle de l'utilisateur via Permit.io pour garantir que seuls les utilisateurs autorisés peuvent ajouter des livres :

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

AddBookHandler effectue les opérations suivantes :

  • Vérifie les autorisations des utilisateurs pour la création de livres.
  • Gère à la fois GET (afficher le formulaire) et POST (ajouter un livre).
  • Valide les données d'entrée.
  • Génère l'UUID pour les nouveaux livres.
  • Gère l'analyse des dates pour les dates de publication.
  • Redirection vers la liste des livres après un ajout réussi.

Vous avez besoin de deux gestionnaires supplémentaires, un pour la suppression et l'autre pour la mise à jour. Ajoutez ce code juste après la fonction AddBookHandler :

CREATE TABLE books (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  title VARCHAR(255) NOT NULL,
  author VARCHAR(255) NOT NULL,
  published_at DATE,
  created_at TIMESTAMPTZ DEFAULT now()
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le DeleteBookHandler effectue les opérations suivantes :

  • Vérifie les autorisations des utilisateurs pour la suppression.
  • Valide l'ID du livre.
  • Effectue la suppression de la base de données.
  • Gère les erreurs et redirige de manière appropriée.

Juste après la fonction DeleteBookHandler, ajoutez ce qui suit :

go mod init bookstore
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le UpdateHandler effectue les opérations suivantes :

  • Vérifie les autorisations de mise à jour.
  • Gère à la fois GET (afficher le formulaire d'édition) et POST (mettre à jour le livre).
  • Récupère les données du livre existant pour les modifier.
  • Valide et traite les mises à jour.
  • Gère le formatage de la date et les mises à jour de la base de données.

Tout au long du code, vous remarquerez que le système d'autorisation est construit autour du cadre de contrôle d'accès basé sur les rôles de Permit.io, qui fournit une gestion sophistiquée des autorisations.

Ce système permet également un contrôle précis sur les actions des utilisateurs et autorise différents niveaux d'accès pour afficher, créer, mettre à jour et supprimer des ressources. Chaque opération dans l'application est soumise à une vérification détaillée des autorisations et garantit que les utilisateurs ne peuvent effectuer que les actions pour lesquelles ils sont autorisés.

Créer un middleware d'autorisation

Maintenant, nous en avons fini avec les gestionnaires. Créez un dossier appelé middleware et, à l'intérieur, créez un fichier appelé middleware.go. Ajoutez le code suivant :

go get github.com/google/uuid \
       github.com/gorilla/mux \
       github.com/joho/godotenv \
       github.com/lib/pq \
       github.com/permitio/permit-golang \
       golang.org/x/crypto
Copier après la connexion
Copier après la connexion

Ce package middleware permet de fournir un hachage et une authentification sécurisés des mots de passe, ainsi que des opérations CRUD pour la gestion des livres dans une application de librairie. Il utilise bcrypt pour hacher les mots de passe pour un stockage sécurisé et vérifie les hachages de mots de passe lors de la connexion. Cela empêche également l'exposition de données sensibles.

La fonction LoginUser authentifie les utilisateurs en comparant leur saisie avec les hachages de mot de passe stockés et récupère le profil utilisateur complet en cas de connexion réussie, à l'exclusion du hachage de mot de passe pour plus de sécurité.

De plus, les opérations CRUD vous permettent de créer, mettre à jour, récupérer et supprimer des enregistrements de livre dans la base de données, avec un contrôle d'accès pour garantir que seuls les utilisateurs autorisés peuvent modifier ou supprimer les entrées qu'ils ont créées. Le package comprend également une fonction GetUserRole pour récupérer les rôles des utilisateurs, facilitant ainsi le contrôle d'accès basé sur les rôles.

Créer les modèles

Créez un autre dossier appelé models, et à l'intérieur, créez un fichier appelé models.go. Et ajoutez ce qui suit :

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce package définit plusieurs modèles de données pour une application de librairie, notamment les structures User, Book et LoginRequest, ainsi qu'un type NullUUID personnalisé pour gérer les UUID nullables dans la base de données.

Presque terminé. La prochaine chose que vous devez faire est de créer les modèles pour votre projet. Vous devrez créer des modèles de connexion et d'indexation, pour ajouter des livres, afficher des livres, supprimer des livres et mettre à jour des livres.

Créer les modèles HTML

Créez un dossier appelé modèles. C'est ici que seront vos modèles HTML.
Pour vous connecter, créez un fichier appelé login.html, et à l'intérieur, collez ceci :

CREATE TABLE books (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  title VARCHAR(255) NOT NULL,
  author VARCHAR(255) NOT NULL,
  published_at DATE,
  created_at TIMESTAMPTZ DEFAULT now()
);
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce package principal sert de point d'entrée pour une application de librairie. Il configure la connectivité de la base de données, la configuration de l'environnement et les routes HTTP pour gérer la connexion des utilisateurs et la gestion des livres.

Dans la fonction principale, les itinéraires sont enregistrés à l'aide du routeur Gorilla Mux. La fonction handlers.NewHandlers initialise les gestionnaires avec la base de données et la clé API Permit.io. Il active des fonctionnalités telles que l'authentification des utilisateurs (/login) et la gestion des livres (/books, /add, /delete, /update). Chaque route est mappée à des méthodes HTTP spécifiques, organisant les points de terminaison pour différentes actions.

Enfin, le serveur démarre sur le port 8080, écoutant les requêtes entrantes et enregistrant toutes les erreurs qui se produisent. Cette configuration garantit une configuration structurée des points de terminaison de l'API et une gestion sécurisée des variables d'environnement.

Testez l'application

Maintenant, c'est à peu près tout ! Démarrons notre application pour voir. le résultat. Pour démarrer le serveur, exécutez cette commande :

go mod init bookstore
Copier après la connexion
Copier après la connexion
Copier après la connexion

Visitez http://localhost:8080/login dans votre navigateur.

Commençons par tester uniquement les autorisations de l'utilisateur_standard :

How to Set Up Authorization in a Bookstore Management System with Go, HTMX, and Permit.io

Vous verrez que l'utilisateur standard_user est limité à l'affichage des livres uniquement et ne peut pas ajouter, supprimer ou mettre à jour un livre.

Connectons-nous maintenant en utilisant l'utilisateur_admin pour voir ce qui se passe :

How to Set Up Authorization in a Bookstore Management System with Go, HTMX, and Permit.io

Vous verrez que l'administrateur a la permission de faire à peu près n'importe quoi ! Voilà à quel point Permit est solide et facile à utiliser !

Vous pouvez consulter ces ressources pour en savoir plus sur l’autorisation du permis :

  • Authentification et autorisation dans les applications.
  • Meilleures pratiques pour des autorisations utilisateur et une délégation d'accès efficaces.
  • Qu'est-ce qu'une autorisation fine

Conclusion

Dans ce didacticiel, nous avons créé une application simple de gestion de librairie pour implémenter un contrôle d'accès basé sur les rôles à l'aide de Go, HTMX et Permit.io. L'autorisation est un aspect fondamental de la sécurité des applications, car elle garantit que les utilisateurs ne peuvent accéder qu'à ce à quoi ils sont autorisés.

La mise en œuvre d'un modèle de contrôle d'accès efficace tel que RBAC ou ABAC dans votre application sécuriserait non seulement votre application, mais améliorerait également son évolutivité et sa conformité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal