> 백엔드 개발 > Golang > Go, HTMX 및 Permit.io를 사용하여 서점 관리 시스템에서 권한 부여를 설정하는 방법

Go, HTMX 및 Permit.io를 사용하여 서점 관리 시스템에서 권한 부여를 설정하는 방법

Mary-Kate Olsen
풀어 주다: 2024-12-01 02:08:10
원래의
397명이 탐색했습니다.

인증은 사용자가 인증 후 액세스할 수 있는 작업과 리소스를 결정하므로 애플리케이션을 구축할 때 승인이 중요합니다.

이 글에서는 Permit.io를 사용하여 인증을 구현하는 방법을 살펴보겠습니다. 이를 시연하기 위해 Golang과 HTMX를 사용하여 간단한 서점 앱을 구축하겠습니다(저는 열렬한 팬입니다).

전제 조건

이 튜토리얼을 진행하려면 다음 전제 조건을 충족해야 합니다.

  • Golang에 대한 기본적인 이해와 함께 설치됩니다.
  • Permit.io 계정입니다.
  • Docker가 설치되었습니다.
  • HTML, HTTP, REST API에 대한 기본 이해
  • PostgreSQL(데이터베이스).
  • SQL에 대한 지식.

프로젝트 범위

  • 이번 시연에서는 간단하게 설명하겠습니다. 관리자와 표준 사용자라는 두 가지 사용자 유형이 있습니다. 둘 다 Permit.io에 등록됩니다. 로그인하면 데이터베이스는 Permit.io를 참조하여 사용자의 역할을 결정하고 해당 작업을 승인합니다.

모든 사용자(관리자 포함)가 책을 읽을 수 있습니다. 관리자는 도서를 추가, 삭제, 업데이트할 수도 있습니다. 일반 사용자는 책 읽기만 가능합니다.

이 튜토리얼은 기본 인증을 통해 서점 애플리케이션을 설정하는 과정을 안내합니다. 우리는 다음을 구현할 것입니다:

  • 인증 논리: Permit.io를 사용하여 역할(관리자 및 표준 사용자)을 정의하여 다양한 리소스에 대한 액세스를 제한하거나 부여합니다.

  • 데이터베이스: 도서 및 사용자 데이터를 저장하기 위해 PostgreSQL 데이터베이스를 설정합니다.

  • 처리기: 액세스 제어 확인을 통해 도서 보기, 추가, 업데이트 및 삭제를 위한 경로를 구현합니다.

  • 프런트엔드: HTMX를 사용하여 도서 데이터를 동적으로 로드합니다.

프로젝트 설정

프로젝트 설정 시, allowed.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

로컬에서 작업하므로 개발 환경을 사용하겠습니다. 개발 환경에서 대시보드 열기를 클릭한 다음 정책 만들기를 클릭합니다. 먼저 새 리소스를 생성하라는 메시지가 표시됩니다. 리소스 생성을 클릭하세요. 이름을 지정하고 작업을 설명합니다. 이 프로젝트에서는 내 책의 이름을 지정하고 작업은 만들기, 업데이트, 삭제, 보기입니다.

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

다음은 allowed.io에서 승인할 사용자를 등록하는 것입니다. 사이드바 메뉴를 통해 홈 메뉴로 다시 이동하면 다음과 같은 내용이 표시됩니다.

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

사용자 추가를 클릭한 다음 추가를 클릭하고 사용자를 추가하세요. 데이터베이스의 사용자에 해당하는 세부 정보를 입력하세요.

완료되면 프로젝트로 다시 이동하세요. 서점 프로젝트를 위한 개발 환경에서 점 3개 아이콘을 클릭하세요. API 키를 복사하는 옵션이 표시됩니다. 프로젝트에 필요하므로 복사하여 어딘가에 저장하세요.

데이터베이스 설정

bookstore라는 PostgreSQL 데이터베이스를 만듭니다. 두 개의 테이블을 설정해야 합니다:

  • 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에 추가된 사용자와 일치하는지 확인하세요.

  • 도서 테이블: 도서 세부정보 저장:
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(Universally Unique Identifier)를 생성하고 사용하는 기능을 제공합니다.

  • github.com/gorilla/mux: 웹 애플리케이션에서 경로를 처리하기 위한 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
로그인 후 복사

데이터베이스 연결 구성

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”
로그인 후 복사

패키지를 가져오는 것 외에도 여기서 하려는 작업은 데이터베이스 연결과 allowed.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(로그인 프로세스)를 모두 처리합니다.
  • 데이터베이스에 대해 사용자를 인증합니다.
  • 인증된 사용자에 대한 세션 쿠키를 설정합니다.
  • 인증을 위해 사용자 데이터를 Permit.io와 동기화합니다.
  • 로그인 성공/실패에 따라 적절한 템플릿을 렌더링합니다.

다음 단계는 도서에 액세스할 수 있는 도서 핸들러를 추가하는 것입니다. 또한 사용자의 역할을 확인하기 위해 allowed.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는 다음을 수행합니다.

  • 쿠키를 통해 사용자 인증을 확인합니다.
  • 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를 생성합니다.
  • 게시 날짜에 대한 날짜 구문 분석을 처리합니다.
  • 추가 성공 후 도서 목록으로 리디렉션됩니다.

삭제용 핸들러와 업데이트용 핸들러 두 개가 더 필요합니다. 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 기능도 포함되어 있습니다.

모델 생성

model이라는 폴더를 하나 더 만들고 그 안에 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
);
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 패키지는 데이터베이스에서 null 허용 UUID를 처리하기 위한 사용자 정의 NullUUID 유형과 함께 User, Book 및 LoginRequest 구조를 포함하여 서점 애플리케이션을 위한 여러 데이터 모델을 정의합니다.

거의 완료되었습니다. 다음으로 해야 할 일은 프로젝트에 대한 템플릿을 만드는 것입니다. 도서 추가, 도서 보기, 도서 삭제, 도서 업데이트를 위해 로그인 및 색인용 템플릿을 만들어야 합니다.

HTML 템플릿 만들기

템플릿이라는 폴더를 만듭니다. 여기에 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 경로를 설정합니다.

주요 기능에서는 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은 견고하고 사용하기 쉽습니다!

허가 승인에 대해 자세히 알아보려면 다음 리소스를 확인하세요.

  • 애플리케이션의 인증 및 승인.
  • 효과적인 사용자 권한 및 액세스 위임을 위한 모범 사례.
  • 세분화된 권한 부여란

결론

이 튜토리얼에서는 Go, HTMX 및 Permit.io를 사용하여 역할 기반 액세스 제어를 구현하는 간단한 서점 관리 앱을 구축했습니다. 인증은 사용자가 허용된 항목에만 액세스할 수 있도록 보장하는 애플리케이션 보안의 기본 측면입니다.

RBAC 또는 ABAC와 같은 효과적인 액세스 제어 모델을 애플리케이션에 구현하면 애플리케이션 보안이 강화될 뿐만 아니라 확장성과 규정 준수도 향상됩니다.

위 내용은 Go, HTMX 및 Permit.io를 사용하여 서점 관리 시스템에서 권한 부여를 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿