検索
ホームページバックエンド開発GolangGo、HTMX、および Permit.io を使用して書店管理システムで認証を設定する方法

承認は、ユーザーが認証後にアクセスできるアクションとリソースを決定するため、アプリケーションを構築する際に重要です。

この記事では、permit.io を使用して認可を実装する方法を見ていきます。それを実証するために、Golang と HTMX を使用してシンプルな書店アプリを構築します (私は大ファンです)。

前提条件

このチュートリアルを進めるには、次の前提条件を満たす必要があります:

  • Golang を基本的な理解とともにインストールします。
  • Permit.io アカウント。
  • Docker がインストールされました。
  • HTML、HTTP、および REST API の基本的な理解。
  • PostgreSQL (データベース)。
  • SQL に精通していること。

プロジェクトの範囲

  • このデモンストレーションでは、物事を単純にしておきます。管理者と標準ユーザーの 2 つのユーザー タイプがあります。どちらも Permit.io に登録されます。ログイン時に、データベースは Permit.io を参照してユーザーの役割を決定し、ユーザーのアクションを承認します。

すべてのユーザー (管理者を含む) が書籍を読むことができます。管理者は書籍を追加、削除、更新することもできます。標準ユーザーは書籍の閲覧に限定されています。

このチュートリアルでは、基本的な認証を使用して書店アプリケーションをセットアップする方法を説明します。以下を実装します:

  • 認可ロジック: Permit.io を使用してロール (管理者および標準ユーザー) を定義し、さまざまなリソースへのアクセスを制限または許可します。

  • データベース: 書籍とユーザーのデータを保存するために PostgreSQL データベースをセットアップします。

  • ハンドラー: アクセス制御チェックを使用して書籍を表示、追加、更新、削除するためのルートを実装します。

  • フロントエンド: HTMX を使用して書籍データを動的に読み込みます。

プロジェクトのセットアップ

プロジェクトのセットアップでは、まずpermit.ioをセットアップします。ダッシュボード ワークスペースに移動し、新しいプロジェクトを作成します。書店の名前を付けておきます。

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

これにより、開発環境と運用環境という 2 つの環境が作成されます。

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

ローカルで作業しているため、開発環境を使用します。 「開発環境でダッシュボードを開く」をクリックし、「ポリシーの作成」をクリックします。最初に新しいリソースを作成するように求められます。 「リソースの作成」をクリックします。名前を付けてアクションを記述します。このプロジェクトでは、マイン ブックに名前を付け、アクションは作成、更新、削除、表示となります。

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

次に、ポリシーエディタセクションに移動します。デフォルトでは、管理者ロールがすでに作成されていることが表示されます。デフォルトでは認識されないため、追加した表示アクションにチェックを入れるだけです。別の役割が必要です。これは、読み取り権限のみを持つユーザーが対象となります。

[作成]、[役割] の順にクリックし、ユーザーの名前を付けます。作成したら、ポリシー エディターにそれが表示され、次のように作成したばかりのユーザー ロールのビューにチェックを入れる必要があります。

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

次に、permit.io によって許可されるユーザーを登録します。サイドバー メニューからホーム メニューに戻ると、次のようなものがまだ表示されているはずです。

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

「ユーザーを追加」をクリックしてから「追加」をクリックし、さらに「ユーザーを追加」をクリックします。データベース内のユーザーに対応する詳細を入力します。

それが完了したら、プロジェクトに戻ります。書店プロジェクトの開発環境で、3 つの点線のアイコンをクリックします。 API キーをコピーするオプションが表示されます。プロジェクトで必要になるため、コピーしてどこかに保存します。

データベースのセットアップ

bookstore という PostgreSQL データベースを作成します。 2 つのテーブルを設定する必要があります:

  • users テーブル: ユーザーの認証情報とロールを保存します:
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL
);

先に進んでこれを入力します。ただし、各ユーザーにそれぞれ管理者とユーザーのロールを割り当て、Permit.io に追加されたユーザーと一致していることを確認してください。

  • books テーブル: 書籍の詳細を保存します:
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()
);

コード内でこれを行うため、これを設定する必要はありません。

依存関係のインストール

次の依存関係をインストールする必要があります:

  • github.com/permitio/permit-golang: Go アプリケーションで Permit.io を使用してロールベースのアクセス制御 (RBAC) と権限管理を処理するためのツールを提供します。

  • github.com/google/uuid: これは、汎用一意識別子 (UUID) を生成し、操作するための関数を提供します。

  • github.com/gorilla/mux: Web アプリケーションでルートを処理するための HTTP リクエスト ルーターとディスパッチャーの実装に役立ちます。

  • github.com/joho/godotenv: これにより、.env から環境変数がロードされます。ファイルをアプリケーションに追加できるため、構成設定の管理が容易になります。

  • github.com/lib/pq: これは、PostgreSQL データベースと通信するための Go の Postgres ドライバーです。

  • golang.org/x/crypto: Go の標準ライブラリに含まれていない補足的な暗号アルゴリズムとライブラリを実装します。

これらの依存関係をインストールするには、新しい Go モジュールを初期化する必要があります。これは Go での依存関係管理の開始点です。

次のコマンドを実行します:

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

次に、次のコマンドを実行します:

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()
);

これにより、上記のすべての依存関係がインストールされます。

PDP (ポリシー決定ポイント) コンテナをセットアップする

PDP をセットアップするには、docker を起動する必要があります。それが完了したら、ターミナルを開いて次のコマンドを実行します:

go mod init bookstore

その後、次のコマンドを使用してコンテナを実行する必要があります:

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

という部分を置き換えます。実際の API キーを使用します。さあ、構築を始めましょう。

アプリケーションを構築する

アプリケーションを構築するには、プロジェクト構造は次のようになります:

docker pull permitio/pdp-v2:latest

まず、.env ファイル内に API キーを追加しましょう。作成してから、次のように許可 API キーを作成します。

 docker run -it -p 7766:7000 --env PDP_DEBUG=True --env PDP_API_KEY=<your_api_key> permitio/pdp-v2:latest
</your_api_key>

データベース接続の構成

config という名前のフォルダーを作成します。その中に、config.go というファイルを作成します。次のコードを追加します:

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

これは、PostgreSQL データベースに接続するための構成をセットアップしているだけです。

ハンドラーを作成する

次に、handlers というフォルダーを作成し、その中に handlers.go というファイルを作成します。その中に、次のコードを追加します:

export PERMIT_API_KEY=”your_api_key”

パッケージのインポートとは別に、ここでやろうとしているのは、データベース接続とpermit.ioを保持する構造を作成することです。ローカル PDP で Permit.io をセットアップする初期化関数も提供しています。

NewHandler がこれを追加した直後:

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
}

LoginHandler は次の処理を行います:

  • GET (ログイン フォームの表示) と POST (ログインの処理) の両方を処理します。
  • データベースに対してユーザーを認証します。
  • 認証されたユーザーのセッション Cookie を設定します。
  • 認可のためにユーザーデータを Permit.io と同期します。
  • ログインの成功/失敗に基づいて適切なテンプレートをレンダリングします。

次のステップは、書籍にアクセスするための書籍ハンドラーを追加することです。また、permit.io を利用してユーザーの役割を確認します。次のコードを 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,
  }
}

BookHandler は次のことを行います:

  • Cookie によるユーザー認証をチェックします。
  • Permit.io を使用してユーザーの役割と権限を確認します。
  • 許可されている場合、データベースから書籍を取得します。
  • 取得したデータを使用して書籍テンプレートをレンダリングします。
  • 認可の失敗を適切に処理します。

次に、書籍を追加するハンドラーが必要です。また、Permit.io を通じてユーザーの役割を検証し、承認されたユーザーのみが書籍を追加できるようにします:

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

AddBookHandler は次の処理を行います:

  • ブック作成に対するユーザー権限を確認します。
  • GET (フォームの表示) と POST (ブックの追加) の両方を処理します。
  • 入力データを検証します。
  • 新しい書籍の UUID を生成します。
  • 出版日の日付解析を処理します。
  • 追加が成功すると書籍リストにリダイレクトされます。

さらに 2 つのハンドラーが必要です。1 つは削除用、もう 1 つは更新用です。このコードを 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()
);

DeleteBookHandler は次のことを行います:

  • ユーザーの削除権限を確認します。
  • 書籍 ID を検証します。
  • データベースの削除を実行します。
  • エラーを処理し、適切にリダイレクトします。

DeleteBookHandler 関数の直後に、次の行を追加します。

go mod init bookstore

UpdateHandler は次の処理を行います:

  • 更新権限をチェックします。
  • GET (編集フォームの表示) と POST (ブックの更新) の両方を処理します。
  • 編集のために既存の書籍データを取得します。
  • 更新を検証して処理します。
  • 日付の形式設定とデータベースの更新を処理します。

コード全体を通して、洗練された権限管理を提供する Permit.io のロールベースのアクセス制御フレームワークを中心に承認システムが構築されていることがわかります。

このシステムにより、ユーザーのアクションをきめ細かく制御でき、リソースの表示、作成、更新、削除にさまざまなレベルのアクセスが可能になります。アプリケーション内の各操作では詳細な権限チェックが行われ、ユーザーが許可されたアクションのみを実行できるようにします。

認可ミドルウェアの作成

これでハンドラーの作成は完了です。 「middleware」というフォルダーを作成し、その中に「middleware.go」というファイルを作成します。次のコードを追加します:

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

このミドルウェア パッケージは、書店アプリケーションで書籍を管理するための CRUD 操作に加えて、安全なパスワード ハッシュと認証を提供するのに役立ちます。 bcrypt を使用してパスワードをハッシュして安全に保管し、ログイン時にパスワード ハッシュを検証します。また、機密データの漏洩も防ぎます。

LoginUser 関数は、ユーザーの入力と保存されているパスワード ハッシュを比較することでユーザーを認証し、ログインに成功すると、セキュリティを強化するためにパスワード ハッシュを除いた完全なユーザー プロファイルを取得します。

また、CRUD 操作を使用すると、データベース内の書籍レコードを作成、更新、取得、削除でき、許可されたユーザーのみが作成したエントリを変更または削除できるようにアクセス制御を行うことができます。このパッケージには、ユーザーの役割を取得する GetUserRole 関数も含まれており、役割ベースのアクセス制御を容易にします。

モデルを作成する

models という名前の別のフォルダーを作成し、その中に models.go というファイルを作成します。そして、以下を追加します:

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

このパッケージは、User、Book、LoginRequest 構造を含む書店アプリケーション用のいくつかのデータ モデルと、データベース内の null 許容 UUID を処理するためのカスタム NullUUID タイプを定義します。

ほぼ完了しました。次に行う必要があるのは、プロジェクトのテンプレートを作成することです。書籍の追加、書籍の表示、書籍の削除、書籍の更新を行うには、ログインとインデックスのテンプレートを作成する必要があります。

HTML テンプレートを作成する

templates という名前のフォルダーを作成します。ここに HTML テンプレートが置かれます。
ログインするには、login.html というファイルを作成し、その中にこれを貼り付けます:

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()
);

このメイン パッケージは、書店アプリケーションのエントリ ポイントとして機能します。ユーザーのログインと書籍管理を処理するためのデータベース接続、環境構成、HTTP ルートを設定します。

main関数では、Gorilla Muxルーターを使用してルートを登録します。 handlers.NewHandlers 関数は、データベースと Permit.io API キーを使用してハンドラーを初期化します。ユーザー認証 (/login) や書籍管理 (/books、/add、/delete、/update) などの機能が有効になります。各ルートは特定の HTTP メソッドにマッピングされ、さまざまなアクションのエンドポイントを編成します。

最後に、サーバーはポート 8080 で起動し、受信リクエストをリッスンし、発生したエラーをログに記録します。この設定により、構造化された API エンドポイント構成と環境変数の安全な処理が保証されます。

アプリケーションをテストする

これですべてです!アプリを起動して見てみましょう。結果。サーバーを起動するには、次のコマンドを実行します:

go mod init bookstore

ブラウザで http://localhost:8080/login にアクセスします。

まずは、standard_user の権限だけをテストしてみましょう:

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

standard_user は書籍の表示のみに制限されており、書籍の追加、削除、更新ができないことがわかります。

次に、admin_user を使用してログインして、何が起こるかを見てみましょう:

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

管理者にはほぼすべてのことを行う権限があることがわかります。それが Permit の堅牢性と使いやすさです。

Permit の承認について詳しくは、次のリソースを確認してください。

  • アプリケーションでの認証と認可。
  • 効果的なユーザー権限とアクセス委任のためのベスト プラクティス。
  • きめ細かい承認とは

結論

このチュートリアルでは、Go、HTMX、および Permit.io を使用してロールベースのアクセス制御を実装するためのシンプルな書店管理アプリを構築しました。承認は、ユーザーが許可されたもののみにアクセスできるようにするため、アプリケーション セキュリティの基本的な側面です。

RBAC や ABAC などの効果的なアクセス制御モデルをアプリケーションに実装すると、アプリケーションのセキュリティが確保されるだけでなく、スケーラビリティとコンプライアンスも強化されます。

以上がGo、HTMX、および Permit.io を使用して書店管理システムで認証を設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Debian OpenSSLの脆弱性は何ですかDebian OpenSSLの脆弱性は何ですかApr 02, 2025 am 07:30 AM

OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

PPROFツールを使用してGOパフォーマンスを分析しますか?PPROFツールを使用してGOパフォーマンスを分析しますか?Mar 21, 2025 pm 06:37 PM

この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

Goでユニットテストをどのように書きますか?Goでユニットテストをどのように書きますか?Mar 21, 2025 pm 06:34 PM

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?Mar 10, 2025 pm 05:38 PM

この記事では、ユニットテストのためにGOのモックとスタブを作成することを示しています。 インターフェイスの使用を強調し、模擬実装の例を提供し、模擬フォーカスを維持し、アサーションライブラリを使用するなどのベストプラクティスについて説明します。 articl

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?Mar 10, 2025 pm 03:20 PM

この記事では、GENICSのGOのカスタムタイプの制約について説明します。 インターフェイスがジェネリック関数の最小タイプ要件をどのように定義するかを詳しく説明し、タイプの安全性とコードの再利用性を改善します。 この記事では、制限とベストプラクティスについても説明しています

Goの反射パッケージの目的を説明してください。いつリフレクションを使用しますか?パフォーマンスへの影響は何ですか?Goの反射パッケージの目的を説明してください。いつリフレクションを使用しますか?パフォーマンスへの影響は何ですか?Mar 25, 2025 am 11:17 AM

この記事では、コードのランタイム操作に使用されるGoの反射パッケージについて説明します。シリアル化、一般的なプログラミングなどに有益です。実行やメモリの使用量の増加、賢明な使用と最高のアドバイスなどのパフォーマンスコストについて警告します

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?Mar 10, 2025 pm 05:36 PM

この記事では、トレースツールを使用してGOアプリケーションの実行フローを分析します。 手動および自動計装技術について説明し、Jaeger、Zipkin、Opentelemetryなどのツールを比較し、効果的なデータの視覚化を強調しています

GOでテーブル駆動型テストをどのように使用しますか?GOでテーブル駆動型テストをどのように使用しますか?Mar 21, 2025 pm 06:35 PM

この記事では、GOでテーブル駆動型のテストを使用して説明します。これは、テストのテーブルを使用して複数の入力と結果を持つ関数をテストする方法です。読みやすさの向上、重複の減少、スケーラビリティ、一貫性、および

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、