-
Couldn't load subscription status.
- Fork 488
Add authorization mechanisms in new Katib UI backend #1983
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
a10cb71
e81457d
d4a486e
7742798
86f190a
971928c
9e28398
ad1e3b0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| package v1beta1 | ||
|
|
||
| import ( | ||
| "context" | ||
| "errors" | ||
| "fmt" | ||
| "log" | ||
| "net/http" | ||
| "strings" | ||
|
|
||
| "github.com/kubeflow/katib/pkg/util/v1beta1/env" | ||
| v1 "k8s.io/api/authorization/v1" | ||
| "k8s.io/apimachinery/pkg/runtime/schema" | ||
| "sigs.k8s.io/controller-runtime/pkg/client" | ||
| ) | ||
|
|
||
| // ENV variables | ||
| var ( | ||
| USER_HEADER = env.GetEnvOrDefault("USERID_HEADER", "kubeflow-userid") | ||
| USER_PREFIX = env.GetEnvOrDefault("USERID_PREFIX", ":") | ||
| DISABLE_AUTH = env.GetEnvOrDefault("APP_DISABLE_AUTH", "false") | ||
| ) | ||
|
|
||
| func GetUsername(r *http.Request) (string, error) { | ||
| var username string | ||
| if DISABLE_AUTH == "true" { | ||
| log.Printf("APP_DISABLE_AUTH set to True. Skipping authentication check") | ||
| return "", nil | ||
| } | ||
|
||
|
|
||
| if r.Header.Get(USER_HEADER) == "" { | ||
| return "", errors.New("user header not present") | ||
| } | ||
|
|
||
| user := r.Header.Get(USER_HEADER) | ||
| username = strings.Replace(user, USER_PREFIX, "", 1) | ||
apo-ger marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| return username, nil | ||
| } | ||
|
|
||
| // Function for constructing SubjectAccessReviews (SAR) objects | ||
| func CreateSAR(user, verb, namespace, resource, subresource, name string, schema schema.GroupVersion) *v1.SubjectAccessReview { | ||
|
|
||
| sar := &v1.SubjectAccessReview{ | ||
| Spec: v1.SubjectAccessReviewSpec{ | ||
| User: user, | ||
| ResourceAttributes: &v1.ResourceAttributes{ | ||
| Namespace: namespace, | ||
| Verb: verb, | ||
| Group: schema.Group, | ||
| Version: schema.Version, | ||
| Resource: resource, | ||
| Subresource: subresource, | ||
| Name: name, | ||
| }, | ||
| }, | ||
| } | ||
| return sar | ||
| } | ||
|
|
||
| func IsAuthorized(user, verb, namespace, resource, subresource, name string, schema schema.GroupVersion, client client.Client) error { | ||
|
|
||
| // Skip authz when admin is explicity requested it | ||
| if DISABLE_AUTH == "true" { | ||
| log.Printf("APP_DISABLE_AUTH set to True. Skipping authorization check") | ||
| return nil | ||
| } | ||
|
|
||
| sar := CreateSAR(user, verb, namespace, resource, subresource, name, schema) | ||
|
|
||
| err := client.Create(context.TODO(), sar) | ||
| if err != nil { | ||
| log.Printf("Error submitting SubjectAccessReview: %v, %s", sar, err.Error()) | ||
| return err | ||
| } | ||
|
|
||
| if sar.Status.Allowed { | ||
| return nil | ||
| } | ||
|
|
||
| msg := generateUnauthorizedMessage(user, verb, namespace, resource, subresource, schema, sar) | ||
| return errors.New(msg) | ||
| } | ||
|
|
||
| func generateUnauthorizedMessage(user, verb, namespace, resource, subresource string, schema schema.GroupVersion, sar *v1.SubjectAccessReview) string { | ||
|
|
||
| msg := fmt.Sprintf("User: %s is not authorized to %s", user, verb) | ||
|
|
||
| if schema.Group == "" { | ||
| msg += fmt.Sprintf(" %s/%s", schema.Version, resource) | ||
| } else { | ||
| msg += fmt.Sprintf(" %s/%s/%s", schema.Group, schema.Version, resource) | ||
| } | ||
|
|
||
| if subresource != "" { | ||
| msg += fmt.Sprintf("/%s", subresource) | ||
| } | ||
|
|
||
| if namespace != "" { | ||
| msg += fmt.Sprintf(" in namespace: %s", namespace) | ||
| } | ||
| if sar.Status.Reason != "" { | ||
| msg += fmt.Sprintf(" ,reason: %s", sar.Status.Reason) | ||
| } | ||
| return msg | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.