Rumah > pembangunan bahagian belakang > Golang > Cara Menyediakan Keizinan dalam Sistem Pengurusan Kedai Buku dengan Go, HTMX dan Permit.io

Cara Menyediakan Keizinan dalam Sistem Pengurusan Kedai Buku dengan Go, HTMX dan Permit.io

Mary-Kate Olsen
Lepaskan: 2024-12-01 02:08:10
asal
397 orang telah melayarinya

Kebenaran adalah penting semasa membina aplikasi, kerana ia menentukan tindakan dan sumber yang dibenarkan untuk diakses oleh pengguna selepas mereka mengesahkannya.

Dalam artikel ini, kita akan melihat cara melaksanakan kebenaran menggunakan permit.io. Untuk menunjukkannya, kami akan membina apl kedai buku ringkas menggunakan Golang dan HTMX (saya peminat tegar).

Prasyarat

Untuk mengikuti tutorial ini, prasyarat berikut harus dipenuhi:

  • Golang dipasang bersama pemahaman asas mengenainya.
  • Akaun Permit.io.
  • Docker dipasang.
  • Pemahaman asas HTML, HTTP dan REST API.
  • PostgreSQL (pangkalan data).
  • Kebiasaan dengan SQL.

Skop Projek

  • Untuk demonstrasi ini, kami akan memastikan perkara mudah. Kami akan mempunyai dua jenis pengguna, pentadbir dan pengguna standard. Kedua-duanya akan didaftarkan di Permit.io. Selepas log masuk, pangkalan data akan merujuk Permit.io untuk menentukan peranan pengguna dan membenarkan tindakan mereka.

Semua pengguna (termasuk pentadbir) boleh membaca buku. Pentadbir juga boleh menambah, memadam dan mengemas kini buku. Pengguna standard terhad kepada membaca buku.

Tutorial ini akan membimbing anda melalui penyediaan aplikasi kedai buku dengan kebenaran asas. Kami akan melaksanakan:

  • Logik Kebenaran: Tentukan peranan (Pentadbir dan Pengguna Standard) menggunakan Permit.io untuk menyekat atau memberikan akses kepada sumber yang berbeza.

  • Pangkalan Data: Sediakan pangkalan data PostgreSQL untuk menyimpan data buku dan pengguna.

  • Pengendali: Laksanakan laluan untuk melihat, menambah, mengemas kini dan memadamkan buku dengan semakan kawalan akses.

  • Hadapan: Gunakan HTMX untuk memuatkan data buku secara dinamik.

Persediaan Projek

Dalam menyediakan projek, kami akan bermula dengan menyediakan permit.io. Navigasi ke ruang kerja papan pemuka anda dan buat projek baharu. Saya akan beri nama kedai buku saya.

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

Ini akan mewujudkan dua persekitaran: persekitaran pembangunan dan persekitaran pengeluaran.

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

Memandangkan kami bekerja secara tempatan, kami akan menggunakan persekitaran pembangunan. Klik pada Buka papan pemuka dalam persekitaran Pembangunan dan kemudian pada Cipta Dasar. Anda akan diminta membuat sumber baharu dahulu. Klik buat sumber. Beri nama dan nyatakan tindakan. Untuk projek ini, saya akan menamakan buku saya, dan tindakannya ialah mencipta, mengemas kini, memadam dan melihat.

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

Seterusnya, navigasi ke bahagian editor dasar. Secara lalai, anda sepatutnya melihat peranan pentadbir telah dibuat. Anda hanya perlu menandai tindakan paparan yang kami tambahkan, kerana tindakan tersebut tidak dikenali secara lalai. Anda perlukan peranan lain. Ini adalah untuk pengguna dengan kebenaran membaca sahaja.

Klik Cipta kemudian Peranan dan berikannya nama pengguna. Setelah dibuat, anda harus melihatnya dalam editor dasar dan tandakan paparan dalam peranan pengguna yang baru anda buat seperti:

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

Perkara seterusnya ialah mendaftarkan pengguna yang akan diberi kuasa oleh permit.io. Navigasi kembali ke menu utama anda melalui menu bar sisi anda masih sepatutnya mempunyai sesuatu seperti ini:

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

Klik pada Tambah pengguna dan kemudian tambah, kemudian tambah pengguna. Isikan butiran yang sepadan dengan pengguna anda dalam pangkalan data.

Setelah itu selesai, navigasi kembali ke projek anda. Dalam Pembangunan Untuk persekitaran untuk projek kedai buku, klik pada ikon 3 titik. Anda akan melihat pilihan untuk menyalin kunci API. Salin dan simpannya di suatu tempat, kerana anda akan memerlukannya untuk projek.

Sediakan Pangkalan Data

Buat pangkalan data PostgreSQL yang dipanggil kedai buku. Anda perlu menyediakan dua jadual:

  • jadual pengguna: Menyimpan bukti kelayakan dan peranan pengguna:
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Teruskan dan isikan ini, tetapi jadikan setiap pengguna mempunyai peranan sebagai pentadbir dan pengguna, masing-masing, dan pastikan mereka sepadan dengan pengguna yang ditambahkan pada Permit.io.

  • jadual buku: Menyimpan butiran buku:
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()
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Anda tidak perlu mengisi ini, kami akan melakukannya dalam kod.

Pasang Ketergantungan

Anda perlu memasang kebergantungan berikut:

  • github.com/permitio/permit-golang: Menyediakan alatan untuk mengendalikan kawalan akses berasaskan peranan (RBAC) dan pengurusan kebenaran dengan aplikasi Permit.io dalam Go.

  • github.com/google/uuid: Ini menyediakan fungsi untuk menjana dan berfungsi dengan pengecam unik universal (UUID).

  • github.com/gorilla/mux: Membantu Melaksanakan penghala permintaan HTTP dan penghantar untuk mengendalikan laluan dalam aplikasi web.

  • github.com/joho/godotenv: Ini memuatkan pembolehubah persekitaran daripada .env. fail ke dalam aplikasi, menjadikannya lebih mudah untuk mengurus tetapan konfigurasi.

  • github.com/lib/pq: Ini ialah pemacu Postgres Go untuk berkomunikasi dengan pangkalan data PostgreSQL.

  • golang.org/x/crypto: Melaksanakan algoritma kriptografi tambahan dan pustaka yang tidak disertakan dalam pustaka standard Go.

Untuk memasang kebergantungan ini, anda perlu memulakan permulaan modul Go baharu. Ini adalah titik permulaan untuk pengurusan pergantungan dalam Go.

Jalankan arahan ini:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Seterusnya, jalankan arahan ini:

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()
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ini akan memasang semua kebergantungan yang disenaraikan di atas.

Sediakan Bekas PDP (Policy Decision Point) anda

Untuk menyediakan PDP, anda perlu memulakan docker. Sebaik sahaja anda melakukannya, buka terminal anda dan jalankan arahan ini:

go mod init bookstore
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Selepas itu anda perlu menjalankan bekas dengan arahan ini:

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
Salin selepas log masuk
Salin selepas log masuk

Ganti bahagian yang tertera dengan kunci API sebenar anda. Sekarang, mari mula membina.

Bina Aplikasi

Untuk membina aplikasi, beginilah struktur projek kami:

docker pull permitio/pdp-v2:latest
Salin selepas log masuk

Mari kita tambahkan Kunci API kita dahulu di dalam fail .env. Buat satu, dan kemudian kunci API permit anda seperti itu:

 docker run -it -p 7766:7000 --env PDP_DEBUG=True --env PDP_API_KEY=<YOUR_API_KEY> permitio/pdp-v2:latest
Salin selepas log masuk

Konfigurasikan Sambungan Pangkalan Data

Buat folder bernama config. Di dalamnya, buat fail bernama config.go. Tambahkan kod berikut:

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
Salin selepas log masuk

Ini hanyalah kami yang menyediakan konfigurasi untuk menyambung ke pangkalan data PostgreSQL.

Buat Pengendali

Seterusnya, buat folder yang dipanggil pengendali, dan di dalamnya, buat fail bernama handler.go. Di dalamnya, tambahkan kod berikut:

export PERMIT_API_KEY=”your_api_key”
Salin selepas log masuk

Selain mengimport pakej, perkara yang kami cuba lakukan di sini ialah mencipta struktur yang memegang sambungan pangkalan data dan permit.io. Kami juga menyediakan fungsi permulaan yang menyediakan Permit.io dengan PDP tempatan.

Sejurus selepas NewHandlers menambah ini dalam:

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
}
Salin selepas log masuk

LoginHandler melakukan perkara berikut:

  • Mengendalikan GET (tunjukkan borang log masuk) dan POST (proses log masuk).
  • Mengesahkan pengguna terhadap pangkalan data.
  • Menetapkan kuki sesi untuk pengguna yang disahkan.
  • Menyegerakkan data pengguna dengan Permit.io untuk kebenaran.
  • Memberikan templat yang sesuai berdasarkan kejayaan/kegagalan log masuk.

Langkah seterusnya ialah menambah pengendali buku untuk mengakses buku. Ia juga akan menggunakan permit.io untuk mengesahkan peranan pengguna. Tambahkan kod berikut sejurus selepas 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,
  }
}
Salin selepas log masuk

Pengurus Buku melakukan perkara berikut:

  • Menyemak pengesahan pengguna melalui kuki.
  • Sahkan peranan dan kebenaran pengguna menggunakan Permit.io.
  • Mengambil buku daripada pangkalan data jika dibenarkan.
  • Memberikan templat buku dengan data yang diambil.
  • Mengendalikan kegagalan kebenaran dengan sewajarnya.

Seterusnya, anda memerlukan pengendali untuk menambah buku. Ia juga akan mengesahkan peranan pengguna melalui Permit.io untuk memastikan hanya pengguna yang diberi kuasa boleh menambah buku:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

AddBookHandler melakukan perkara berikut:

  • Menyemak kebenaran pengguna untuk penciptaan buku.
  • Mengendalikan GET (tunjukkan borang) dan POST (tambah buku).
  • Mengesahkan data input.
  • Menjana UUID untuk buku baharu.
  • Mengendalikan penghuraian tarikh untuk tarikh penerbitan.
  • Ubah hala ke senarai buku selepas penambahan berjaya.

Anda memerlukan dua lagi pengendali, satu untuk memadam dan satu lagi untuk mengemas kini. Tambahkan kod ini sejurus selepas fungsi 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()
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

DeleteBookHandler melakukan perkara berikut:

  • Sahkan kebenaran pengguna untuk pemadaman.
  • Mengesahkan ID buku.
  • Melakukan pemadaman pangkalan data.
  • Mengendalikan ralat dan mengubah hala dengan sewajarnya.

Sejurus selepas fungsi DeleteBookHandler, tambahkan yang berikut:

go mod init bookstore
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pengendali Kemas Kini melakukan perkara berikut:

  • Menyemak kebenaran kemas kini.
  • Mengendalikan GET (tunjukkan borang edit) dan POST (kemas kini buku).
  • Mengambil data buku sedia ada untuk diedit.
  • Mengesahkan dan memproses kemas kini.
  • Mengendalikan pemformatan tarikh dan kemas kini pangkalan data.

Sepanjang kod, anda akan dapati bahawa sistem kebenaran dibina di sekitar rangka kerja kawalan akses berasaskan peranan Permit.io, yang menyediakan pengurusan kebenaran yang canggih.

Sistem ini juga membolehkan kawalan terperinci ke atas tindakan pengguna dan membenarkan tahap akses yang berbeza untuk melihat, mencipta, mengemas kini dan memadamkan sumber. Setiap operasi dalam aplikasi menjalani semakan kebenaran terperinci dan memastikan pengguna hanya boleh melakukan tindakan yang mereka dibenarkan.

Cipta Perisian Tengah Kebenaran

Sekarang kita sudah selesai dengan pengendali. Cipta folder bernama middleware, dan di dalamnya, buat fail bernama middleware.go. Tambahkan kod berikut:

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
Salin selepas log masuk
Salin selepas log masuk

Pakej perisian tengah ini membantu menyediakan pencincangan dan pengesahan kata laluan yang selamat, bersama-sama dengan operasi CRUD untuk mengurus buku dalam aplikasi kedai buku. Ia menggunakan bcrypt untuk mencincang kata laluan untuk storan selamat dan mengesahkan cincang kata laluan semasa log masuk. Ia juga menghalang pendedahan data sensitif.

Fungsi LoginUser mengesahkan pengguna dengan membandingkan input mereka dengan cincang kata laluan yang disimpan dan mendapatkan semula profil pengguna penuh apabila log masuk berjaya, tidak termasuk cincang kata laluan untuk keselamatan tambahan.

Selain itu, operasi CRUD membolehkan anda membuat, mengemas kini, mendapatkan semula dan memadam rekod buku dalam pangkalan data, dengan kawalan akses untuk memastikan hanya pengguna yang diberi kuasa boleh mengubah suai atau memadamkan entri yang mereka cipta. Pakej ini juga termasuk fungsi GetUserRole untuk mendapatkan semula peranan pengguna, memudahkan kawalan akses berasaskan peranan.

Buat Model

Buat folder lain yang dipanggil model, dan di dalamnya, buat fail bernama models.go. Dan tambahkan yang berikut:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pakej ini mentakrifkan beberapa model data untuk aplikasi kedai buku, termasuk struktur Pengguna, Buku dan Permintaan Masuk, bersama-sama dengan jenis NullUUID tersuai untuk mengendalikan UUID boleh null dalam pangkalan data.

Hampir selesai. Perkara seterusnya yang perlu anda lakukan ialah mencipta templat untuk projek anda. Anda perlu membuat templat untuk log masuk dan indeks, untuk menambah buku, melihat buku, memadamkan buku dan mengemas kini buku.

Buat Templat HTML

Buat folder yang dipanggil templat. Di sinilah templat html anda akan berada.
Untuk log masuk, buat fail yang dipanggil login.html, dan di dalamnya, tampal ini:

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()
);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pakej utama ini berfungsi sebagai pintu masuk untuk aplikasi kedai buku. Ia menyediakan sambungan pangkalan data, konfigurasi persekitaran dan laluan HTTP untuk mengendalikan log masuk pengguna dan pengurusan buku.

Dalam fungsi utama, laluan didaftarkan menggunakan penghala Gorilla Mux. Fungsi handlers.NewHandlers memulakan pengendali dengan pangkalan data dan kunci API Permit.io. Ia membolehkan kefungsian seperti pengesahan pengguna (/log masuk) dan pengurusan buku (/books, /add, /delete, /update). Setiap laluan dipetakan kepada kaedah HTTP tertentu, mengatur titik akhir untuk tindakan yang berbeza.

Akhir sekali, pelayan bermula pada port 8080, mendengar permintaan masuk dan mengelog sebarang ralat yang berlaku. Persediaan ini memastikan konfigurasi titik akhir API berstruktur dan pengendalian selamat pembolehubah persekitaran.

Uji Aplikasi

Sekarang itu tentang segala-galanya! Mari mulakan aplikasi kami untuk melihat. hasilnya. Untuk memulakan pelayan, jalankan arahan ini:

go mod init bookstore
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Lawati http://localhost:8080/login dalam penyemak imbas anda.

Mari kita mulakan dengan menguji hanya kebenaran pengguna_standard:

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

Anda akan melihat bahawa pengguna_standard dihadkan untuk melihat buku sahaja dan tidak boleh menambah, memadam atau mengemas kini buku.

Mari kita log masuk menggunakan admin_user untuk melihat apa yang berlaku:

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

Anda akan melihat bahawa pentadbir mempunyai kebenaran untuk melakukan apa sahaja! Begitulah Permit yang kukuh dan mudah digunakan!

Anda boleh menyemak sumber ini untuk mengetahui lebih lanjut tentang kebenaran Permit:

  • Pengesahan dan Keizinan dalam Aplikasi.
  • Amalan Terbaik untuk Kebenaran Pengguna Berkesan dan Delegasi Akses.
  • Apakah itu Keizinan berbutir halus

Kesimpulan

Dalam tutorial ini, kami membina apl pengurusan kedai buku ringkas untuk melaksanakan kawalan akses berasaskan peranan menggunakan Go, HTMX dan Permit.io. Keizinan adalah aspek asas keselamatan aplikasi, kerana ia memastikan pengguna hanya boleh mengakses perkara yang dibenarkan.

Melaksanakan model kawalan akses yang berkesan seperti RBAC atau ABAC ke dalam aplikasi anda bukan sahaja akan menjamin aplikasi anda tetapi juga meningkatkan kebolehskalaan dan pematuhannya.

Atas ialah kandungan terperinci Cara Menyediakan Keizinan dalam Sistem Pengurusan Kedai Buku dengan Go, HTMX dan Permit.io. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan