基本身份验证中间件提供了一种强大且灵活的方式来保护您的 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 中间件的处理程序,您可以使用
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中文网其他相关文章!