姊妹篇:
gin路由相关方法
gin数据返回相关方法
get方法用query和querydefault
post方法,用c.Bind的话,需要是json格式,否则解析不了
form-data和x-www-form-urlencoded 不行
番外: 权限认证
1 2 3
| s.http.Use(gin.BasicAuth(gin.Accounts{ s.conf.BasicUser: s.conf.BasicPasswd, }))
|
gin.BasicAuth用来保护gin路由,仅允许授权用户访问。
gin.BasicAuth接收gin.Accounts参数,Accounts是一个map,key是用户名,value是密码。
代码中的意思是:
使用gin.BasicAuth中间件
设置用户名为s.conf.BasicUser,密码为s.conf.BasicPasswd
只有使用这个用户名和密码登录的请求,才能通过这个BasicAuth中间件,访问后续路由处理函数。
使用BasicAuth的主要步骤是:
定义用户名密码,如:
1 2 3
| accounts := gin.Accounts{ "admin": "password", }
|
在路由组使用BasicAuth中间件:
1 2 3
| router := gin.Default() authorized := router.Group("/authorized") authorized.Use(gin.BasicAuth(accounts))
|
后续路由都受到这个BasicAuth中间件保护
1
| authorized.POST("/login", loginHandler)
|
请求需要带上Authorization头,值为Base64编码后的”用户名:密码”
1
| Authorization: Basic YWRtaW46cGFzc3dvcmQ=
|
匹配上用户名密码后才能访问处理函数
所以通过gin.BasicAuth可以很方便的为路由组添加HTTP基本身份验证功能。
注意中间有那个冒号
go中的base64:
1 2 3 4 5 6 7 8 9
| package main
import "encoding/base64"
func main() { data := "hello world" encoded := base64.StdEncoding.EncodeToString([]byte(data)) fmt.Println(encoded) }
|
番外:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| func (s *Service) checkdns(domain string) (bool, error) { msg := &dns.Msg{} msg.SetQuestion(dns.Fqdn(domain), dns.TypeCNAME) ctx, cf := context.WithTimeout(context.Background(), time.Second*10) defer cf()
r, err := dns.ExchangeContext(ctx, msg, DNSUpstream) if err != nil { return false, err } if r.Rcode != dns.RcodeSuccess { return false, errors.New("dns response not ok") }
for _, ans := range r.Answer { if cname, ok := ans.(*dns.CNAME); ok { if cname.Target == s.conf.MyDomain { return true, nil } } }
return false, errors.New("cname to here not found") }
|
这段代码是一个Go语言函数,用于检查给定域名的DNS记录是否存在特定的CNAME记录。
函数名为checkdns,它是定义在Service结构体上的一个方法。该方法接收一个domain参数,表示要检查的域名。函数返回两个值:一个布尔值和一个错误值。
函数的主要功能是通过向指定的DNS服务器发送DNS查询请求,检查域名的CNAME记录。它使用了github.com/miekg/dns包来进行DNS操作。
代码的主要逻辑如下:
- 创建一个空的
dns.Msg对象,用于构造DNS查询消息。
- 使用
msg.SetQuestion方法设置查询问题,将域名转换为全限定域名(Fully Qualified Domain Name,FQDN),查询类型为CNAME。
- 使用
context.WithTimeout方法创建一个带有超时的上下文对象,超时时间为10秒。
- 调用
dns.ExchangeContext方法发送DNS查询请求并获取响应。
- 检查是否有错误发生,如果有错误则返回
false和该错误。
- 检查DNS响应的Rcode字段,如果不等于
dns.RcodeSuccess,表示DNS响应不正常,返回false和一个自定义的错误信息。
- 遍历DNS响应的Answer字段,对每个回答进行检查。
- 如果回答是一个CNAME记录且目标与
Service结构体的conf.MyDomain字段相匹配,则表示找到了符合条件的CNAME记录,返回true和nil。
- 如果没有找到符合条件的CNAME记录,则返回
false和一个自定义的错误信息。
总体来说,这段代码用于检查给定域名的CNAME记录是否存在,并判断目标是否与Service结构体中的配置相匹配。
最终rongyi老哥的代码会生成一个nginx的conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| root@VM-0-61-ubuntu:/etc/nginx/conf.d# cat cui.wode.tech.conf
server { listen 443 ssl; server_name cui.wode.tech;
ssi on; ssi_silent_errors on; ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate /data/lego/.lego/certificates/cui.wode.tech.pem; ssl_certificate_key /data/lego/.lego/certificates/cui.wode.tech.key; ssl_session_timeout 5m; ssl_prefer_server_ciphers on; ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header X-Content-Type-Options "nosniff"; add_header X-Frame-Options SAMEORIGIN; add_header X-XSS-Protection "1; mode=block"; client_max_body_size 20m; access_log /data/log/nginx/cui.wode.tech.log;
location / { try_files $uri $uri/ /index.html; # TODO: change real server root /data/taskonsaas; index index.html index.htm; } }
server { listen 80; server_name cui.wode.tech; client_max_body_size 50m;
return 301 https://cui.wode.tech; }
|
原文链接: https://dashen.tech/2019/03/25/gin参数解析相关方法/
版权声明: 转载请注明出处.