mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 09:22:44 +00:00
Merge pull request #35679 from xilabao/fix-repeat-request-for-auth
Automatic merge from submit-queue (batch tested with PRs 35884, 37305, 37369, 37429, 35679) fix repeat request for auth reference to #27851 When use basic-auth/RBAC, don't set the users in .kube/config ``` # cat ~/.kube/config apiVersion: v1 clusters: - cluster: insecure-skip-tls-verify: true server: https://127.0.0.1:6443 name: ubuntu contexts: - context: cluster: ubuntu namespace: default user: test name: ubuntu current-context: ubuntu kind: Config preferences: {} users: [] ``` kubectl request for username/password time after time ``` $ kubectl get nodes Please enter Username: admin Please enter Password: ****** Please enter Username: admin Please enter Password: ****** ```
This commit is contained in:
commit
9a89e8cdcb
@ -44,7 +44,7 @@ var (
|
|||||||
// DEPRECATED will be replace
|
// DEPRECATED will be replace
|
||||||
DefaultClientConfig = DirectClientConfig{*clientcmdapi.NewConfig(), "", &ConfigOverrides{
|
DefaultClientConfig = DirectClientConfig{*clientcmdapi.NewConfig(), "", &ConfigOverrides{
|
||||||
ClusterDefaults: ClusterDefaults,
|
ClusterDefaults: ClusterDefaults,
|
||||||
}, nil, NewDefaultClientConfigLoadingRules()}
|
}, nil, NewDefaultClientConfigLoadingRules(), promptedCredentials{}}
|
||||||
)
|
)
|
||||||
|
|
||||||
// getDefaultServer returns a default setting for DefaultClientConfig
|
// getDefaultServer returns a default setting for DefaultClientConfig
|
||||||
@ -72,6 +72,11 @@ type ClientConfig interface {
|
|||||||
|
|
||||||
type PersistAuthProviderConfigForUser func(user string) restclient.AuthProviderConfigPersister
|
type PersistAuthProviderConfigForUser func(user string) restclient.AuthProviderConfigPersister
|
||||||
|
|
||||||
|
type promptedCredentials struct {
|
||||||
|
username string
|
||||||
|
password string
|
||||||
|
}
|
||||||
|
|
||||||
// DirectClientConfig is a ClientConfig interface that is backed by a clientcmdapi.Config, options overrides, and an optional fallbackReader for auth information
|
// DirectClientConfig is a ClientConfig interface that is backed by a clientcmdapi.Config, options overrides, and an optional fallbackReader for auth information
|
||||||
type DirectClientConfig struct {
|
type DirectClientConfig struct {
|
||||||
config clientcmdapi.Config
|
config clientcmdapi.Config
|
||||||
@ -79,21 +84,23 @@ type DirectClientConfig struct {
|
|||||||
overrides *ConfigOverrides
|
overrides *ConfigOverrides
|
||||||
fallbackReader io.Reader
|
fallbackReader io.Reader
|
||||||
configAccess ConfigAccess
|
configAccess ConfigAccess
|
||||||
|
// promptedCredentials store the credentials input by the user
|
||||||
|
promptedCredentials promptedCredentials
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDefaultClientConfig creates a DirectClientConfig using the config.CurrentContext as the context name
|
// NewDefaultClientConfig creates a DirectClientConfig using the config.CurrentContext as the context name
|
||||||
func NewDefaultClientConfig(config clientcmdapi.Config, overrides *ConfigOverrides) ClientConfig {
|
func NewDefaultClientConfig(config clientcmdapi.Config, overrides *ConfigOverrides) ClientConfig {
|
||||||
return &DirectClientConfig{config, config.CurrentContext, overrides, nil, NewDefaultClientConfigLoadingRules()}
|
return &DirectClientConfig{config, config.CurrentContext, overrides, nil, NewDefaultClientConfigLoadingRules(), promptedCredentials{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNonInteractiveClientConfig creates a DirectClientConfig using the passed context name and does not have a fallback reader for auth information
|
// NewNonInteractiveClientConfig creates a DirectClientConfig using the passed context name and does not have a fallback reader for auth information
|
||||||
func NewNonInteractiveClientConfig(config clientcmdapi.Config, contextName string, overrides *ConfigOverrides, configAccess ConfigAccess) ClientConfig {
|
func NewNonInteractiveClientConfig(config clientcmdapi.Config, contextName string, overrides *ConfigOverrides, configAccess ConfigAccess) ClientConfig {
|
||||||
return &DirectClientConfig{config, contextName, overrides, nil, configAccess}
|
return &DirectClientConfig{config, contextName, overrides, nil, configAccess, promptedCredentials{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewInteractiveClientConfig creates a DirectClientConfig using the passed context name and a reader in case auth information is not provided via files or flags
|
// NewInteractiveClientConfig creates a DirectClientConfig using the passed context name and a reader in case auth information is not provided via files or flags
|
||||||
func NewInteractiveClientConfig(config clientcmdapi.Config, contextName string, overrides *ConfigOverrides, fallbackReader io.Reader, configAccess ConfigAccess) ClientConfig {
|
func NewInteractiveClientConfig(config clientcmdapi.Config, contextName string, overrides *ConfigOverrides, fallbackReader io.Reader, configAccess ConfigAccess) ClientConfig {
|
||||||
return &DirectClientConfig{config, contextName, overrides, fallbackReader, configAccess}
|
return &DirectClientConfig{config, contextName, overrides, fallbackReader, configAccess, promptedCredentials{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *DirectClientConfig) RawConfig() (clientcmdapi.Config, error) {
|
func (config *DirectClientConfig) RawConfig() (clientcmdapi.Config, error) {
|
||||||
@ -159,7 +166,7 @@ func (config *DirectClientConfig) ClientConfig() (*restclient.Config, error) {
|
|||||||
authInfoName, _ := config.getAuthInfoName()
|
authInfoName, _ := config.getAuthInfoName()
|
||||||
persister = PersisterForUser(config.configAccess, authInfoName)
|
persister = PersisterForUser(config.configAccess, authInfoName)
|
||||||
}
|
}
|
||||||
userAuthPartialConfig, err := getUserIdentificationPartialConfig(configAuthInfo, config.fallbackReader, persister)
|
userAuthPartialConfig, err := config.getUserIdentificationPartialConfig(configAuthInfo, config.fallbackReader, persister)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -201,7 +208,7 @@ func getServerIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo,
|
|||||||
// 2. configAuthInfo.auth-path (this file can contain information that conflicts with #1, and we want #1 to win the priority)
|
// 2. configAuthInfo.auth-path (this file can contain information that conflicts with #1, and we want #1 to win the priority)
|
||||||
// 3. if there is not enough information to idenfity the user, load try the ~/.kubernetes_auth file
|
// 3. if there is not enough information to idenfity the user, load try the ~/.kubernetes_auth file
|
||||||
// 4. if there is not enough information to identify the user, prompt if possible
|
// 4. if there is not enough information to identify the user, prompt if possible
|
||||||
func getUserIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, fallbackReader io.Reader, persistAuthConfig restclient.AuthProviderConfigPersister) (*restclient.Config, error) {
|
func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, fallbackReader io.Reader, persistAuthConfig restclient.AuthProviderConfigPersister) (*restclient.Config, error) {
|
||||||
mergedConfig := &restclient.Config{}
|
mergedConfig := &restclient.Config{}
|
||||||
|
|
||||||
// blindly overwrite existing values based on precedence
|
// blindly overwrite existing values based on precedence
|
||||||
@ -234,6 +241,11 @@ func getUserIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, fa
|
|||||||
|
|
||||||
// if there still isn't enough information to authenticate the user, try prompting
|
// if there still isn't enough information to authenticate the user, try prompting
|
||||||
if !canIdentifyUser(*mergedConfig) && (fallbackReader != nil) {
|
if !canIdentifyUser(*mergedConfig) && (fallbackReader != nil) {
|
||||||
|
if len(config.promptedCredentials.username) > 0 && len(config.promptedCredentials.password) > 0 {
|
||||||
|
mergedConfig.Username = config.promptedCredentials.username
|
||||||
|
mergedConfig.Password = config.promptedCredentials.password
|
||||||
|
return mergedConfig, nil
|
||||||
|
}
|
||||||
prompter := NewPromptingAuthLoader(fallbackReader)
|
prompter := NewPromptingAuthLoader(fallbackReader)
|
||||||
promptedAuthInfo, err := prompter.Prompt()
|
promptedAuthInfo, err := prompter.Prompt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -244,6 +256,8 @@ func getUserIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, fa
|
|||||||
mergedConfig = &restclient.Config{}
|
mergedConfig = &restclient.Config{}
|
||||||
mergo.Merge(mergedConfig, promptedConfig)
|
mergo.Merge(mergedConfig, promptedConfig)
|
||||||
mergo.Merge(mergedConfig, previouslyMergedConfig)
|
mergo.Merge(mergedConfig, previouslyMergedConfig)
|
||||||
|
config.promptedCredentials.username = mergedConfig.Username
|
||||||
|
config.promptedCredentials.password = mergedConfig.Password
|
||||||
}
|
}
|
||||||
|
|
||||||
return mergedConfig, nil
|
return mergedConfig, nil
|
||||||
|
Loading…
Reference in New Issue
Block a user