zvvq技术分享网

中间件如何在Golang框架中实现认证和授权?(n

作者:zvvq博客网
导读在go框架中,中间件认证和授权用于在请求处理前验证用户身份和访问权限。认证通过检查令牌或凭据验证用户身份,而授权则通过检查角色或属性确定用户访问特定资源的权限。auth

在go框架中,中间件认证和授权用于在请求处理前验证用户身份和访问权限。认证通过检查令牌或凭据验证用户身份,而授权则通过检查角色或属性确定用户访问特定资源的权限。authware和authorizer中间件可用于实施认证和授权,从而轻松地将这些功能添加到应用程序中。

zvvq.cn

内容来自zvvq,别采集哟

Go框架中的中间件认证和授权

在Go框架中,中间件用于在HTTP请求到达处理程序之前对其进行处理。这使得我们可以轻松地为应用程序添加跨控制器和路由的通用功能,比如认证和授权。

内容来自samhan

认证

认证负责验证用户的身份。我们可以使用中间件来检查传入请求是否存在有效的身份验证令牌或其他凭据。 zvvq.cn

1

内容来自zvvq,别采集哟

2

内容来自samhan

3 zvvq.cn

4

zvvq.cn

5 内容来自samhan

6 内容来自samhan

7

内容来自samhan666

8 zvvq.cn

9

zvvq.cn

10

zvvq

11 zvvq好,好zvvq

12 本文来自zvvq

13

zvvq.cn

14 zvvq

15 内容来自zvvq

16

zvvq

17

内容来自zvvq

18 本文来自zvvq

19 zvvq好,好zvvq

20

copyright zvvq

21 本文来自zvvq

22

zvvq

23

内容来自samhan666

24

内容来自samhan

25

内容来自zvvq,别采集哟

26 内容来自zvvq,别采集哟

27

内容来自zvvq

28

内容来自zvvq,别采集哟

29

zvvq.cn

30 copyright zvvq

31

内容来自zvvq

32 内容来自samhan666

33

内容来自zvvq

34

内容来自samhan

35

内容来自samhan

36

copyright zvvq

37

zvvq好,好zvvq

38 zvvq.cn

import ( zvvq.cn

"context" 内容来自samhan666

"fmt" 内容来自zvvq,别采集哟

"net/http" 内容来自zvvq,别采集哟

middleware "<a style=color:f60; text-decoration:underline; href="https://www.php.cn/zt/15841.html" target="_blank">git</a>hub.com/go-chi/chi/middleware"

zvvq.cn

)

zvvq.cn

// Authware ...

copyright zvvq

type Authware struct {

本文来自zvvq

Verifier interface{}

内容来自zvvq,别采集哟

} 内容来自zvvq

// NewAuthware ...

copyright zvvq

func NewAuthware(verifier interface{}) Authware {

zvvq.cn

return &Authware{Verifier: verifier}

zvvq.cn

}

本文来自zvvq

func (a Authware) Auth(next http.Handler) http.Handler { zvvq.cn

return http.HandlerFunc(func(w http.ResponseWriter, r http.Request) {

内容来自zvvq

token := r.Header.Get("Authorization")

本文来自zvvq

if token == "" {

内容来自zvvq

middleware.Render(w, r, http.StatusUnauthorized, nil)

copyright zvvq

return 内容来自zvvq

}

zvvq好,好zvvq

ctx := r.Context() zvvq.cn

verifier := a.Verifier.(func(context.Context, http.Request, string) (interface{}, error))

内容来自samhan666

user, err := verifier(ctx, r, token) zvvq.cn

if err != nil { 内容来自zvvq

middleware.Render(w, r, http.StatusBadRequest, fmt.Sprintf("Unable to verify token: %v", err))

内容来自samhan666

return 内容来自zvvq

}

copyright zvvq

r = r.WithContext(context.WithValue(ctx, "user", user)) zvvq好,好zvvq

next.ServeHTTP(w, r) 内容来自zvvq

}) 本文来自zvvq

}

内容来自zvvq,别采集哟

授权

授权负责检查用户是否有权访问特定资源。我们可以通过检查用户在认证期间获得的角色或其他属性来实现授权。 copyright zvvq

”;

本文来自zvvq

1

内容来自zvvq,别采集哟

2 内容来自zvvq

3

copyright zvvq

4

zvvq好,好zvvq

5

本文来自zvvq

6

copyright zvvq

7 内容来自zvvq,别采集哟

8 本文来自zvvq

9

本文来自zvvq

10

内容来自zvvq

11 内容来自zvvq,别采集哟

12 zvvq好,好zvvq

13

本文来自zvvq

14

zvvq好,好zvvq

15 zvvq

16 内容来自zvvq,别采集哟

17

zvvq好,好zvvq

18 本文来自zvvq

19 本文来自zvvq

20

zvvq好,好zvvq

21

内容来自samhan

22

zvvq

23 内容来自samhan666

24 内容来自zvvq,别采集哟

25 zvvq

26 内容来自samhan666

27 zvvq

28

zvvq好,好zvvq

29 copyright zvvq

30

本文来自zvvq

31 本文来自zvvq

32 本文来自zvvq

33 内容来自samhan

import (

zvvq

"context"

内容来自samhan

"fmt"

内容来自zvvq

"net/http"

zvvq

middleware "github.com/go-chi/chi/middleware"

copyright zvvq

)

内容来自zvvq,别采集哟

// Authorizer ... 内容来自samhan

type Authorizer struct { 本文来自zvvq

Authorizer interface{} zvvq

} 内容来自zvvq,别采集哟

// NewAuthorizer ... zvvq

func NewAuthorizer(authorizer interface{}) Authorizer {

copyright zvvq

return &Authorizer{Authorizer: authorizer} 本文来自zvvq

} 内容来自samhan

func (a Authorizer) Authorize(role string, next http.Handler) http.Handler {

本文来自zvvq

return http.HandlerFunc(func(w http.ResponseWriter, r http.Request) {

本文来自zvvq

user := r.Context().Value("user") 本文来自zvvq

ctx := r.Context()

zvvq

authorizer := a.Authorizer.(func(context.Context, interface{}, string) error) 内容来自samhan666

err := authorizer(ctx, user, role) 内容来自samhan666

if err != nil { copyright zvvq

middleware.Render(w, r, http.StatusForbidden, fmt.Sprintf("Access denied: %v", err)) copyright zvvq

return 内容来自samhan666

} zvvq

next.ServeHTTP(w, r)

内容来自zvvq,别采集哟

}) 内容来自samhan666

} 内容来自samhan

实战案例

我们可以使用Authware和Authorizer中间件来实现用户管理API。

本文来自zvvq

1 内容来自samhan

2 内容来自zvvq

3

zvvq

4 zvvq.cn

5 本文来自zvvq

6

内容来自zvvq,别采集哟

7

内容来自samhan

8

zvvq

9 本文来自zvvq

10

zvvq

11

zvvq.cn

12

zvvq

13

本文来自zvvq

14 zvvq.cn

15 copyright zvvq

16 内容来自zvvq,别采集哟

17 zvvq.cn

18

内容来自samhan

19

zvvq

20 内容来自zvvq

21

内容来自samhan666

import (

内容来自samhan666

//... zvvq好,好zvvq

"github.com/gin-gonic/gin"

zvvq.cn

) 内容来自zvvq

func main() {

zvvq好,好zvvq

r := gin.New()

zvvq好,好zvvq

a := NewAuthware(verifier) zvvq好,好zvvq

auth := a.Auth(next) zvvq

b := NewAuthorizer(authorizer)

内容来自samhan

admin := b.Authorize("admin", next) 内容来自zvvq,别采集哟

r.GET("/protected", auth, func(c gin.Context) {

zvvq好,好zvvq

// ... copyright zvvq

}) 本文来自zvvq

r.GET("/admin", auth, admin, func(c gin.Context) {

zvvq

// ...

zvvq好,好zvvq

}) zvvq.cn

} 内容来自samhan

通过这种方式,我们可以轻松地将认证和授权逻辑添加到Go应用程序中,从而确保只有经过授权的用户才能访问特定资源。 本文来自zvvq

以上就是中间件如何在Golang框架中实现认证和授权?的详细内容,更多请关注其它相关文章! 本文来自zvvq