在go框架中,中间件认证和授权用于在请求处理前验证用户身份和访问权限。认证通过检查令牌或凭据验证用户身份,而授权则通过检查角色或属性确定用户访问特定资源的权限。authware和authorizer中间件可用于实施认证和授权,从而轻松地将这些功能添加到应用程序中。
内容来自zvvq,别采集哟
Go框架中的中间件认证和授权
在Go框架中,中间件用于在HTTP请求到达处理程序之前对其进行处理。这使得我们可以轻松地为应用程序添加跨控制器和路由的通用功能,比如认证和授权。
内容来自samhan
认证
认证负责验证用户的身份。我们可以使用中间件来检查传入请求是否存在有效的身份验证令牌或其他凭据。 zvvq.cn
1
2
3 zvvq.cn
4
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
18 本文来自zvvq
19 zvvq好,好zvvq
20
21 本文来自zvvq
22
zvvq
23
内容来自samhan666
24
25
内容来自zvvq,别采集哟
26 内容来自zvvq,别采集哟
27
28
内容来自zvvq,别采集哟
29
zvvq.cn
30 copyright zvvq
31
32 内容来自samhan666
33
34
内容来自samhan
35
36
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
)
// Authware ...
type Authware struct {
Verifier interface{}
内容来自zvvq,别采集哟
} 内容来自zvvq
// NewAuthware ...
copyright zvvq
func NewAuthware(verifier interface{}) Authware {
return &Authware{Verifier: verifier}
}
func (a Authware) Auth(next http.Handler) http.Handler { zvvq.cn
return http.HandlerFunc(func(w http.ResponseWriter, r http.Request) {
token := r.Header.Get("Authorization")
if token == "" {
内容来自zvvq
middleware.Render(w, r, http.StatusUnauthorized, nil)
return 内容来自zvvq
}
zvvq好,好zvvq
ctx := r.Context() zvvq.cn
verifier := a.Verifier.(func(context.Context, http.Request, string) (interface{}, error))
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))
return 内容来自zvvq
}
r = r.WithContext(context.WithValue(ctx, "user", user)) zvvq好,好zvvq
next.ServeHTTP(w, r) 内容来自zvvq
}) 本文来自zvvq
}
授权
授权负责检查用户是否有权访问特定资源。我们可以通过检查用户在认证期间获得的角色或其他属性来实现授权。 copyright zvvq
1
内容来自zvvq,别采集哟
2 内容来自zvvq
3
4
5
6
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
29 copyright zvvq
30
31 本文来自zvvq
32 本文来自zvvq
33 内容来自samhan
import (
"context"
"fmt"
"net/http"
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 {
return http.HandlerFunc(func(w http.ResponseWriter, r http.Request) {
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)
}) 内容来自samhan666
} 内容来自samhan
实战案例
我们可以使用Authware和Authorizer中间件来实现用户管理API。
1 内容来自samhan
2 内容来自zvvq
3
zvvq
4 zvvq.cn
5 本文来自zvvq
6
内容来自zvvq,别采集哟
7
8
9 本文来自zvvq
10
zvvq
11
12
zvvq
13
本文来自zvvq
14 zvvq.cn
15 copyright zvvq
16 内容来自zvvq,别采集哟
17 zvvq.cn
18
内容来自samhan
19
zvvq
20 内容来自zvvq
21
import (
内容来自samhan666
//... zvvq好,好zvvq
"github.com/gin-gonic/gin"
) 内容来自zvvq
func main() {
zvvq好,好zvvq
r := gin.New()
zvvq好,好zvvq
a := NewAuthware(verifier) zvvq好,好zvvq
auth := a.Auth(next) zvvq
b := NewAuthorizer(authorizer)
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