mirror of
https://github.com/beego/bee.git
synced 2024-11-21 23:50:54 +00:00
Merge pull request #436 from franzwilhelm/master
Add complete swagger 3.0 security support for oauth2, apiKey and basic
This commit is contained in:
commit
69760a96ec
@ -16,7 +16,7 @@ script:
|
|||||||
- go vet $(go list ./... | grep -v /vendor/)
|
- go vet $(go list ./... | grep -v /vendor/)
|
||||||
- structcheck $(go list ./... | grep -v /vendor/)
|
- structcheck $(go list ./... | grep -v /vendor/)
|
||||||
- gosimple -ignore "$(cat gosimple.ignore)" $(go list ./... | grep -v /vendor/)
|
- gosimple -ignore "$(cat gosimple.ignore)" $(go list ./... | grep -v /vendor/)
|
||||||
- staticcheck $(go list ./... | grep -v /vendor/)
|
- staticcheck -ignore "$(cat staticcheck.ignore)" $(go list ./... | grep -v /vendor/)
|
||||||
- unused $(go list ./... | grep -v /vendor/)
|
- unused $(go list ./... | grep -v /vendor/)
|
||||||
- unconvert $(go list ./... | grep -v /vendor/)
|
- unconvert $(go list ./... | grep -v /vendor/)
|
||||||
- ineffassign .
|
- ineffassign .
|
||||||
|
@ -184,11 +184,62 @@ func GenerateDocs(curpath string) {
|
|||||||
rootapi.Schemes = strings.Split(strings.TrimSpace(s[len("@Schemes"):]), ",")
|
rootapi.Schemes = strings.Split(strings.TrimSpace(s[len("@Schemes"):]), ",")
|
||||||
} else if strings.HasPrefix(s, "@Host") {
|
} else if strings.HasPrefix(s, "@Host") {
|
||||||
rootapi.Host = strings.TrimSpace(s[len("@Host"):])
|
rootapi.Host = strings.TrimSpace(s[len("@Host"):])
|
||||||
|
} else if strings.HasPrefix(s, "@SecurityDefinition") {
|
||||||
|
if len(rootapi.SecurityDefinitions) == 0 {
|
||||||
|
rootapi.SecurityDefinitions = make(map[string]swagger.Security)
|
||||||
|
}
|
||||||
|
var out swagger.Security
|
||||||
|
p := getparams(strings.TrimSpace(s[len("@SecurityDefinition"):]))
|
||||||
|
if len(p) < 2 {
|
||||||
|
beeLogger.Log.Fatalf("Not enough params for security: %d\n", len(p))
|
||||||
|
}
|
||||||
|
out.Type = p[1]
|
||||||
|
switch out.Type {
|
||||||
|
case "oauth2":
|
||||||
|
if len(p) < 6 {
|
||||||
|
beeLogger.Log.Fatalf("Not enough params for oauth2: %d\n", len(p))
|
||||||
|
}
|
||||||
|
if !(p[3] == "implicit" || p[3] == "password" || p[3] == "application" || p[3] == "accessCode") {
|
||||||
|
beeLogger.Log.Fatalf("Unknown flow type: %s. Possible values are `implicit`, `password`, `application` or `accessCode`.\n", p[1])
|
||||||
|
}
|
||||||
|
out.AuthorizationURL = p[2]
|
||||||
|
out.Flow = p[3]
|
||||||
|
if len(p)%2 != 0 {
|
||||||
|
out.Description = strings.Trim(p[len(p)-1], `" `)
|
||||||
|
}
|
||||||
|
out.Scopes = make(map[string]string)
|
||||||
|
for i := 4; i < len(p)-1; i += 2 {
|
||||||
|
out.Scopes[p[i]] = strings.Trim(p[i+1], `" `)
|
||||||
|
}
|
||||||
|
case "apiKey":
|
||||||
|
if len(p) < 4 {
|
||||||
|
beeLogger.Log.Fatalf("Not enough params for apiKey: %d\n", len(p))
|
||||||
|
}
|
||||||
|
if !(p[3] == "header" || p[3] == "query") {
|
||||||
|
beeLogger.Log.Fatalf("Unknown in type: %s. Possible values are `query` or `header`.\n", p[4])
|
||||||
|
}
|
||||||
|
out.Name = p[2]
|
||||||
|
out.In = p[3]
|
||||||
|
if len(p) > 4 {
|
||||||
|
out.Description = strings.Trim(p[4], `" `)
|
||||||
|
}
|
||||||
|
case "basic":
|
||||||
|
if len(p) > 2 {
|
||||||
|
out.Description = strings.Trim(p[2], `" `)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
beeLogger.Log.Fatalf("Unknown security type: %s. Possible values are `oauth2`, `apiKey` or `basic`.\n", p[1])
|
||||||
|
}
|
||||||
|
rootapi.SecurityDefinitions[p[0]] = out
|
||||||
|
} else if strings.HasPrefix(s, "@Security") {
|
||||||
|
if len(rootapi.Security) == 0 {
|
||||||
|
rootapi.Security = make([]map[string][]string, 0)
|
||||||
|
}
|
||||||
|
rootapi.Security = append(rootapi.Security, getSecurity(s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Analyse controller package
|
// Analyse controller package
|
||||||
for _, im := range f.Imports {
|
for _, im := range f.Imports {
|
||||||
localName := ""
|
localName := ""
|
||||||
@ -631,6 +682,11 @@ func parserComments(comments *ast.CommentGroup, funcName, controllerName, pkgpat
|
|||||||
opts.Produces = append(opts.Produces, ahtml)
|
opts.Produces = append(opts.Produces, ahtml)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if strings.HasPrefix(t, "@Security") {
|
||||||
|
if len(opts.Security) == 0 {
|
||||||
|
opts.Security = make([]map[string][]string, 0)
|
||||||
|
}
|
||||||
|
opts.Security = append(opts.Security, getSecurity(t))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -921,6 +977,19 @@ func appendModels(pkgpath, controllerName string, realTypes []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSecurity(t string) (security map[string][]string) {
|
||||||
|
security = make(map[string][]string)
|
||||||
|
p := getparams(strings.TrimSpace(t[len("@Security"):]))
|
||||||
|
if len(p) == 0 {
|
||||||
|
beeLogger.Log.Fatalf("No params for security specified\n")
|
||||||
|
}
|
||||||
|
security[p[0]] = make([]string, 0)
|
||||||
|
for i := 1; i < len(p); i++ {
|
||||||
|
security[p[0]] = append(security[p[0]], p[i])
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func urlReplace(src string) string {
|
func urlReplace(src string) string {
|
||||||
pt := strings.Split(src, "/")
|
pt := strings.Split(src, "/")
|
||||||
for i, p := range pt {
|
for i, p := range pt {
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
github.com/beego/bee/cmd/commands/run/*.go:S1024
|
github.com/beego/bee/cmd/commands/run/*.go:S1024
|
||||||
github.com/beego/bee/cmd/commands/dlv/*.go:S1024
|
github.com/beego/bee/cmd/commands/dlv/*.go:S1024
|
||||||
|
github.com/beego/bee/utils/*.go:S1026
|
||||||
|
1
staticcheck.ignore
Normal file
1
staticcheck.ignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
github.com/beego/bee/generate/swaggergen/*.go:SA1024
|
49
vendor/github.com/astaxie/beego/swagger/swagger.go
generated
vendored
49
vendor/github.com/astaxie/beego/swagger/swagger.go
generated
vendored
@ -22,19 +22,19 @@ package swagger
|
|||||||
|
|
||||||
// Swagger list the resource
|
// Swagger list the resource
|
||||||
type Swagger struct {
|
type Swagger struct {
|
||||||
SwaggerVersion string `json:"swagger,omitempty" yaml:"swagger,omitempty"`
|
SwaggerVersion string `json:"swagger,omitempty" yaml:"swagger,omitempty"`
|
||||||
Infos Information `json:"info" yaml:"info"`
|
Infos Information `json:"info" yaml:"info"`
|
||||||
Host string `json:"host,omitempty" yaml:"host,omitempty"`
|
Host string `json:"host,omitempty" yaml:"host,omitempty"`
|
||||||
BasePath string `json:"basePath,omitempty" yaml:"basePath,omitempty"`
|
BasePath string `json:"basePath,omitempty" yaml:"basePath,omitempty"`
|
||||||
Schemes []string `json:"schemes,omitempty" yaml:"schemes,omitempty"`
|
Schemes []string `json:"schemes,omitempty" yaml:"schemes,omitempty"`
|
||||||
Consumes []string `json:"consumes,omitempty" yaml:"consumes,omitempty"`
|
Consumes []string `json:"consumes,omitempty" yaml:"consumes,omitempty"`
|
||||||
Produces []string `json:"produces,omitempty" yaml:"produces,omitempty"`
|
Produces []string `json:"produces,omitempty" yaml:"produces,omitempty"`
|
||||||
Paths map[string]*Item `json:"paths" yaml:"paths"`
|
Paths map[string]*Item `json:"paths" yaml:"paths"`
|
||||||
Definitions map[string]Schema `json:"definitions,omitempty" yaml:"definitions,omitempty"`
|
Definitions map[string]Schema `json:"definitions,omitempty" yaml:"definitions,omitempty"`
|
||||||
SecurityDefinitions map[string]Security `json:"securityDefinitions,omitempty" yaml:"securityDefinitions,omitempty"`
|
SecurityDefinitions map[string]Security `json:"securityDefinitions,omitempty" yaml:"securityDefinitions,omitempty"`
|
||||||
Security map[string][]string `json:"security,omitempty" yaml:"security,omitempty"`
|
Security []map[string][]string `json:"security,omitempty" yaml:"security,omitempty"`
|
||||||
Tags []Tag `json:"tags,omitempty" yaml:"tags,omitempty"`
|
Tags []Tag `json:"tags,omitempty" yaml:"tags,omitempty"`
|
||||||
ExternalDocs *ExternalDocs `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"`
|
ExternalDocs *ExternalDocs `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Information Provides metadata about the API. The metadata can be used by the clients if needed.
|
// Information Provides metadata about the API. The metadata can be used by the clients if needed.
|
||||||
@ -75,16 +75,17 @@ type Item struct {
|
|||||||
|
|
||||||
// Operation Describes a single API operation on a path.
|
// Operation Describes a single API operation on a path.
|
||||||
type Operation struct {
|
type Operation struct {
|
||||||
Tags []string `json:"tags,omitempty" yaml:"tags,omitempty"`
|
Tags []string `json:"tags,omitempty" yaml:"tags,omitempty"`
|
||||||
Summary string `json:"summary,omitempty" yaml:"summary,omitempty"`
|
Summary string `json:"summary,omitempty" yaml:"summary,omitempty"`
|
||||||
Description string `json:"description,omitempty" yaml:"description,omitempty"`
|
Description string `json:"description,omitempty" yaml:"description,omitempty"`
|
||||||
OperationID string `json:"operationId,omitempty" yaml:"operationId,omitempty"`
|
OperationID string `json:"operationId,omitempty" yaml:"operationId,omitempty"`
|
||||||
Consumes []string `json:"consumes,omitempty" yaml:"consumes,omitempty"`
|
Consumes []string `json:"consumes,omitempty" yaml:"consumes,omitempty"`
|
||||||
Produces []string `json:"produces,omitempty" yaml:"produces,omitempty"`
|
Produces []string `json:"produces,omitempty" yaml:"produces,omitempty"`
|
||||||
Schemes []string `json:"schemes,omitempty" yaml:"schemes,omitempty"`
|
Schemes []string `json:"schemes,omitempty" yaml:"schemes,omitempty"`
|
||||||
Parameters []Parameter `json:"parameters,omitempty" yaml:"parameters,omitempty"`
|
Parameters []Parameter `json:"parameters,omitempty" yaml:"parameters,omitempty"`
|
||||||
Responses map[string]Response `json:"responses,omitempty" yaml:"responses,omitempty"`
|
Responses map[string]Response `json:"responses,omitempty" yaml:"responses,omitempty"`
|
||||||
Deprecated bool `json:"deprecated,omitempty" yaml:"deprecated,omitempty"`
|
Security []map[string][]string `json:"security,omitempty" yaml:"security,omitempty"`
|
||||||
|
Deprecated bool `json:"deprecated,omitempty" yaml:"deprecated,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parameter Describes a single operation parameter.
|
// Parameter Describes a single operation parameter.
|
||||||
@ -100,7 +101,7 @@ type Parameter struct {
|
|||||||
Default interface{} `json:"default,omitempty" yaml:"default,omitempty"`
|
Default interface{} `json:"default,omitempty" yaml:"default,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// A limited subset of JSON-Schema's items object. It is used by parameter definitions that are not located in "body".
|
// ParameterItems A limited subset of JSON-Schema's items object. It is used by parameter definitions that are not located in "body".
|
||||||
// http://swagger.io/specification/#itemsObject
|
// http://swagger.io/specification/#itemsObject
|
||||||
type ParameterItems struct {
|
type ParameterItems struct {
|
||||||
Type string `json:"type,omitempty" yaml:"type,omitempty"`
|
Type string `json:"type,omitempty" yaml:"type,omitempty"`
|
||||||
|
Loading…
Reference in New Issue
Block a user