server/service/rbac/resource.go (106 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package rbac
import (
"fmt"
"strings"
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/server/config"
mapset "github.com/deckarep/golang-set"
"github.com/go-chassis/cari/rbac"
)
const (
ResourceAccount = "account"
ResourceConfig = "config"
ResourceRole = "role"
ResourceService = "service"
ResourceGovern = "governance"
ResourceSchema = "service/schema"
ResourceOps = "ops"
)
var (
APITokenGranter = "/v4/token"
APISelfPerms = "/v4/self-perms"
APIAccountList = "/v4/accounts"
APIAccountLockList = "/v4/account-locks"
APIRoleList = "/v4/roles"
APIAccountPassword = "/v4/accounts/:name/password"
APIOps = "/v4/:project/admin"
APIGov = "/v1/:project/gov/"
APILegacyGov = "/v4/:project/govern"
APIServiceInfo = "/v4/:project/registry/microservices/:serviceId"
APIServicesList = "/v4/:project/registry/microservices"
APIServiceProperties = "/v4/:project/registry/microservices/:serviceId/properties"
APIServiceExistence = "/v4/:project/registry/existence"
APIProConDependency = "/v4/:project/registry/microservices/:providerId/consumers"
APIConProDependency = "/v4/:project/registry/microservices/:consumerId/providers"
APIHeartbeats = "/v4/:project/registry/heartbeats"
APIInstanceWatcher = "/v4/:project/registry/microservices/:serviceId/watcher"
APIInstanceListWatcher = "/v4/:project/registry/microservices/:serviceId/listwatcher"
APIServiceTag = "/v4/:project/registry/microservices/:serviceId/tags"
APIServiceTagKey = "/v4/:project/registry/microservices/:serviceId/tags/:key"
APIServiceRule = "/v4/:project/registry/microservices/:serviceId/rules"
APIServiceRuleList = "/v4/:project/registry/microservices/:serviceId/rules/rule_id"
APIServiceSchema = "/v4/:project/registry/microservices/:serviceId/schemas"
authResources = map[string]struct{}{}
whiteAPIList = mapset.NewSet()
)
func InitResourceMap() {
rbac.PartialMapResource(APIAccountList, ResourceAccount)
rbac.PartialMapResource(APIRoleList, ResourceRole)
rbac.PartialMapResource(APIGov, ResourceGovern)
rbac.PartialMapResource(APIServiceSchema, ResourceSchema)
rbac.PartialMapResource(APIOps, ResourceOps)
rbac.PartialMapResource("instances", ResourceService)
rbac.PartialMapResource(APILegacyGov, ResourceService)
rbac.MapResource(APIAccountLockList, ResourceAccount)
rbac.MapResource(APIServiceInfo, ResourceService)
rbac.MapResource(APIServicesList, ResourceService)
rbac.MapResource(APIServiceProperties, ResourceService)
rbac.MapResource(APIServiceExistence, ResourceService)
rbac.MapResource(APIProConDependency, ResourceService)
rbac.MapResource(APIConProDependency, ResourceService)
rbac.MapResource(APIHeartbeats, ResourceService)
rbac.MapResource(APIInstanceWatcher, ResourceService)
rbac.MapResource(APIInstanceListWatcher, ResourceService)
rbac.MapResource(APIServiceRuleList, ResourceService)
rbac.MapResource(APIServiceRule, ResourceService)
rbac.MapResource(APIServiceTag, ResourceService)
rbac.MapResource(APIServiceTagKey, ResourceService)
initAuthResources()
}
func initAuthResources() {
// scope MUST contain role and account resources
scopes := strings.Split(config.GetString("rbac.scope", "*")+",role,account", ",")
for _, scope := range scopes {
if scope == "*" {
authResources = map[string]struct{}{}
break
}
authResources[scope] = struct{}{}
}
log.Info(fmt.Sprintf("init must auth resources: %v", authResources))
}
func AuthResource(resource string) bool {
if len(authResources) == 0 {
return true
}
_, ok := authResources[resource]
return ok
}
func MustAuth(apiPattern string) bool {
found := true
if len(authResources) > 0 {
resource := rbac.GetResource(apiPattern)
_, found = authResources[resource]
}
if !found {
return false
}
return rbac.MustAuth(apiPattern)
}
func Add2CheckPermWhiteAPIList(path ...string) {
for _, p := range path {
whiteAPIList.Add(p)
}
}
func MustCheckPerm(apiPattern string) bool {
return !whiteAPIList.Contains(apiPattern)
}