首页 >后端开发 >Golang >Iris 基本身份验证中间件

Iris 基本身份验证中间件

Barbara Streisand
Barbara Streisand原创
2024-11-01 18:40:29433浏览

Basic Authentication Middleware for Iris

概述

基本身份验证中间件提供了一种强大且灵活的方式来保护您的 Iris Web 应用程序。它支持各种用户存储方法,包括内存列表、文件和数据库,并提供密码加密、自定义错误处理和会话过期等高级功能。

安装

要使用 basicauth 中间件,您需要将其导入到 Iris 应用程序中:

import "github.com/kataras/iris/v12/middleware/basicauth"

特征

认证功能

中间件的核心是Allow字段,它是一个函数,其签名如下:

func(ctx iris.Context, username, password string) (any, bool)

该函数负责验证用户名和密码。它返回一个用户对象(或任何其他类型)和一个指示身份验证是否成功的布尔值。

用户结构(助手)

虽然中间件不需要特定的用户结构,但您可以使用辅助结构来更方便地管理用户数据。这是用户结构的示例:

type User struct {
    Username string   `json:"username"`
    Password string   `json:"password"`
    Roles    []string `json:"roles"`
}

内存中用户存储

您可以使用用户结构切片将用户存储在内存中。这对于小型应用程序或测试目的很有用。

var users = []User{
    {"admin", "admin", []string{"admin"}},
    {"kataras", "kataras_pass", []string{"manager", "author"}},
    {"george", "george_pass", []string{"member"}},
    {"john", "john_pass", []string{}},
}

基本设置

要设置中间件,请创建 basicauth.Options 的实例并将其传递给 basicauth.New。

opts := basicauth.Options{
    Realm: basicauth.DefaultRealm,
    MaxAge: 10 * time.Minute,
    GC: basicauth.GC{
        Every: 2 * time.Hour,
    },
    Allow: basicauth.AllowUsers(users),
}

auth := basicauth.New(opts)

使用文件进行用户存储

您可以从文件(JSON 或 YAML)加载用户。这对于用户数据频繁更改的应用程序非常有用。

auth := basicauth.Load("users.yml")

加密货币选项

BCRYPT 选项允许您使用 bcrypt 进行密码散列。 Bcrypt 是一种密码哈希函数,旨在计算密集型以抵御暴力攻击。它广泛用于安全存储密码。

auth := basicauth.Load("users.yml", basicauth.BCRYPT)

您还可以将 BCRYPT 选项与其他用户获取方法一起使用,例如内存或数据库存储。

使用数据库进行用户存储

为了进行更动态的用户管理,您可以根据数据库验证用户。以下是如何使用 MySQL 数据库设置中间件的示例:

package main

import (
    "context"
    "database/sql"
    "fmt"
    "os"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/basicauth"

    _ "github.com/go-sql-driver/mysql"
)

type User struct {
    ID       int64  `db:"id" json:"id"`
    Username string `db:"username" json:"username"`
    Password string `db:"password" json:"password"`
    Email    string `db:"email" json:"email"`
}

func (u User) GetUsername() string {
    return u.Username
}

func (u User) GetPassword() string {
    return u.Password
}

func main() {
    dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?parseTime=true&charset=utf8mb4&collation=utf8mb4_unicode_ci",
        getenv("MYSQL_USER", "user_myapp"),
        getenv("MYSQL_PASSWORD", "dbpassword"),


    get

env("MYSQL_HOST", "localhost"),
        getenv("MYSQL_DATABASE", "myapp"),
    )
    db, err := connect(dsn)
    if err != nil {
        panic(err)
    }

    // Validate a user from database.
    allowFunc := func(ctx iris.Context, username, password string) (any, bool) {
        user, err := db.getUserByUsernameAndPassword(context.Background(), username, password)
        return user, err == nil
    }

    opts := basicauth.Options{
        Realm:        basicauth.DefaultRealm,
        ErrorHandler: basicauth.DefaultErrorHandler,
        Allow:        allowFunc,
    }

    auth := basicauth.New(opts)

    app := iris.New()
    app.Use(auth)
    app.Get("/", index)
    app.Listen(":8080")
}

func index(ctx iris.Context) {
    user, _ := ctx.User().GetRaw()
    // user is a type of main.User
    ctx.JSON(user)
}

自定义错误处理

您可以通过设置 basicauth.Options 中的 ErrorHandler 字段来自定义错误处理行为。

opts := basicauth.Options{
    ErrorHandler: func(ctx iris.Context, err error) {
        ctx.StatusCode(iris.StatusUnauthorized)
        ctx.JSON(iris.Map{"error": "Unauthorized"})
    },
}

会话过期

中间件支持会话过期。您可以设置 MaxAge 字段来指定用户必须重新进行身份验证的持续时间。

opts := basicauth.Options{
    MaxAge: 10 * time.Minute,
}

垃圾收集

要从内存中清除过期用户,您可以设置 GC 字段。

import "github.com/kataras/iris/v12/middleware/basicauth"

使用 BasicAuth 中间件测试处理程序

要测试使用 BasicAuth 中间件的处理程序,您可以使用

http测试

Iris 提供的套餐。以下是如何测试处理程序的示例:

func(ctx iris.Context, username, password string) (any, bool)

例子

这是一个完整的示例,演示了如何使用内存用户存储设置中间件:

type User struct {
    Username string   `json:"username"`
    Password string   `json:"password"`
    Roles    []string `json:"roles"`
}

结论

基本身份验证中间件提供了一个全面的解决方案来保护您的 Iris Web 应用程序。它支持各种用户存储方法、密码加密和自定义错误处理等高级功能,并且易于集成,是开发人员的强大工具。

以上是Iris 基本身份验证中间件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn