redis

package
v0.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2025 License: Apache-2.0 Imports: 14 Imported by: 0

Documentation

Index

Constants

View Source
const (
	Realm                     objectType = "realm"
	RealmClients                         = "realm clients"
	RealmUsers                           = "realm users"
	RealmUserFederationConfig            = " realm user federation config"
	Client                               = "client"
	User                                 = "user"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type RedisDataManager

type RedisDataManager struct {
	// contains filtered or unexported fields
}

RedisDataManager is a redis client

  • Redis Data Manager is a service class for managing authorization server data in Redis
  • There are following store Rules:
  • 1. Realms (data.Realm) in Redis storing separately from Clients && Users, every Realm stores in Redis by key forming from template && Realm name
  • i.e. if we have Realm with name "wissance" it could be accessed by key fe.realm_wissance (realmKeyTemplate)
  • 2. Realm Clients ([]data.ExtendedIdentifier) storing in Redis by key forming from template, Realm with name wissance has array of clients id by key
  • fe.realm_wissance_clients (realmClientsKeyTemplate)
  • 3. Every Client (data.Client) stores separately by key forming from client name (different realms could have clients with same name but in different realm,
  • Client Name is unique only in Realm) and template clientKeyTemplate, therefore realm with pair (ID: 6e09faca-1004-11ee-be56-0242ac120002 Name: homeApp)
  • could be received by key - fe.wissance_client_homeApp
  • 4. Every User in Redis storing by it own key forming by userName + template (userKeyTemplate) -> i.e. user with (ID: 6e09faca-1004-11ee-be56-0242ac120002 Name: homeApp) stored
  • by key fe.wissance_user_homeApp
  • 5. Client to Realm and User to Realm relation stored by separate keys forming using template and realm name, these relations stores array of data.ExtendedIdentifier
  • that wires together Realm Name with User.ID and User.Name.
  • IMPORTANT NOTES:
  • 1. When save Client or User don't forget to save relations in Redis too (see templates realmClientsKeyTemplate && realmUsersKeyTemplate)
  • 2. When add/modify new or existing user don't forget to update realmUsersFullDataKeyTemplate maybe this collection will be removed in future but currently
  • we have it.

func CreateRedisDataManager

func CreateRedisDataManager(dataSourceCfg *config.DataSourceConfig, logger *logging.AppLogger) (*RedisDataManager, error)

CreateRedisDataManager is factory function for instance of RedisDataManager creation

Simply creates instance of RedisDataManager and initializes redis client, this function requires config.Namespace to be set up in configs, otherwise
* defaultNamespace is using
* Parameters:
*     - dataSourceCfg contains Redis specific settings in Options map (see allowed keys of map in config.DataSourceConnOption)
*     - logger - initialized logger instance

func (*RedisDataManager) CreateClient

func (mn *RedisDataManager) CreateClient(realmName string, clientNew data.Client) error

CreateClient - new client creation

Returns an error if the client exists in redis. Clients with same name could exist in different realms, but pair realmName, clientName
* must be unique!
* 1. Check Realm, that is not possible to create client in non-existing Realm
* 2. Check Client, if we found we are rising error
* Arguments:
*    - realmName - name of a Realm that newly creating Client is associated
*    - clientNew - new Client data (body)
* Returns: error if creation failed, otherwise - nil

func (*RedisDataManager) CreateRealm

func (mn *RedisDataManager) CreateRealm(newRealm data.Realm) error

CreateRealm - creates a realm, if the realm has users and clients, they will also be created.

Create Realm, if it contains User s it creates them too:
* 1. Check realm by name, realmName MUST be unique
* 2. Iterate over Client's, Create Clients
* 3. Create Client's - Realm connection
* 4. Iterate over User's, Create Users
* 5. Create User's - Realm connection
* 6. Create Realm
* Arguments:
*    - newRealm - newly creating realm body data with Clients and Users
* Returns: error

func (*RedisDataManager) CreateUser

func (mn *RedisDataManager) CreateUser(realmName string, userNew data.User) error

CreateUser - new user creation

Returns an error if the user exists in redis
* Arguments:
*    - realmName
*    - userNew
* Returns: error

func (*RedisDataManager) CreateUserFederationConfig

func (mn *RedisDataManager) CreateUserFederationConfig(realmName string, userFederationConfig data.UserFederationServiceConfig) error

CreateUserFederationConfig creates new data.UserFederationServiceConfig related to data.Realm by name

This function constructs Redis key by pattern combines namespace and realm name and config name (realmUserFederationService)
* and creates config, unlike Users or Clients number of UserFederationConfig is not big, therefore we don't create a new sub-storage
* Parameters:
*     - realmName - name of a Realm
*     - userFederationConfig - newly creating object data.UserFederationServiceConfig
* Returns: error

func (*RedisDataManager) DeleteClient

func (mn *RedisDataManager) DeleteClient(realmName string, clientName string) error

DeleteClient - deleting an existing client by pair (realmName, clientName)

It also deletes the client from realmClients, clients && realmClients stored in a separate collections
* Arguments:
*    - realmName - name of a realm
*    - clientName - name of a client
* Returns: error

func (*RedisDataManager) DeleteRealm

func (mn *RedisDataManager) DeleteRealm(realmName string) error

DeleteRealm - deleting the realm with all it Client's and User's

  1. Get Client's associated with a realm * 2. Iterate over Client's, Delete Client's * 3. Delete relation Realm - Client's * 4. Get Realm User * 5. Iterate over User's, Delete User's * 6. Delete Realm * Arguments: * - realmName - name of a Realm to Delete * Returns: error

func (*RedisDataManager) DeleteUser

func (mn *RedisDataManager) DeleteUser(realmName string, userName string) error

DeleteUser - deleting an existing user

It also deletes the user from realmUsers
* Arguments:
*    - realmName
*    - userName
* Returns: error

func (*RedisDataManager) DeleteUserFederationConfig

func (mn *RedisDataManager) DeleteUserFederationConfig(realmName string, configName string) error

DeleteUserFederationConfig removes data.UserFederationServiceConfig from storage

It simply removes data.UserFederationServiceConfig by key based on realmName + configName
* Arguments:
*    - realmName - name of a data.Realm
*    - configName - name of a data.UserFederationServiceConfig
* Returns: error

func (*RedisDataManager) GetClient

func (mn *RedisDataManager) GetClient(realmName string, clientName string) (*data.Client, error)

GetClient function for get realm client by name

This function constructs Redis key by pattern combines namespace and realm name and client name (clientKeyTemplate)
* Parameters:
*     - realmName - name of a realm
*     - clientName - name of a client
* Returns: client and error

func (*RedisDataManager) GetClients

func (mn *RedisDataManager) GetClients(realmName string) ([]data.Client, error)

GetClients - getting clients from the specified realm

  1. Get Realm clients short info by realmName * 2. Iterate over clients short info and build full Client data * Arguments: * - realmName * Returns: Tuple = slice of client, error

func (*RedisDataManager) GetRealm

func (mn *RedisDataManager) GetRealm(realmName string) (*data.Realm, error)

GetRealm function for getting realm by name, returns the realm with clients but no users.

This function constructs Redis key by pattern combines namespace and realm name (realmKeyTemplate). Unlike from FILE provider.
* Realm stored in Redis does not have Clients and Users inside Realm itself, these objects must be queried separately.
* Parameters:
*     - realmName name of a realm
* Returns: Tuple - realm and error

func (*RedisDataManager) GetUser

func (mn *RedisDataManager) GetUser(realmName string, userName string) (data.User, error)

GetUser function for getting realm user by username

This function constructs Redis key by pattern combines namespace, realm name and username (userKeyTemplate)
* Parameters:
*    - realmName
*    - userName
* Returns: User and error

func (*RedisDataManager) GetUserById

func (mn *RedisDataManager) GetUserById(realmName string, userId uuid.UUID) (data.User, error)

GetUserById function for getting realm user by userId

This function is more complex than GetUser, because we are using combination of realm name and username to store user data,
* therefore this function extracts all realm users data and find appropriate by relation id-name after that it behaves like GetUser function
* Parameters:
*    - realmName
*    - userId - identifier of searching user
* Returns: User and error

func (*RedisDataManager) GetUserFederationConfig

func (mn *RedisDataManager) GetUserFederationConfig(realmName string, configName string) (*data.UserFederationServiceConfig, error)

GetUserFederationConfig return data.UserFederationServiceConfig of configured Federation service

This function constructs Redis key by pattern combines namespace and realm name and config name (realmUserFederationService)
* all Realm Federation Config stores in Redis List Object
* Parameters:
*     - realmName - name of a Realm
*     - configName - name of a User Federation Service config
* Returns: config and error

func (*RedisDataManager) GetUserFederationConfigs

func (mn *RedisDataManager) GetUserFederationConfigs(realmName string) ([]data.UserFederationServiceConfig, error)

func (*RedisDataManager) GetUsers

func (mn *RedisDataManager) GetUsers(realmName string) ([]data.User, error)

GetUsers function for getting all realm users

This function select all realm users (used by getRealmUsers) by constructing redis key from namespace and realm name
* Probably in future this function could consume a lot of memory (if we would have a lot of users in a realm) probably we should limit amount of Users to fetch
* This function works in two steps:
*     1. Get all data.ExtendedIdentifier pairs id-name
*     2. Get all User objects at once by key slices (every redis key for user combines from namespace, realm, username)
* Parameters:
*    - realmName - name of the realm
* Returns slice of Users and error

func (*RedisDataManager) IsAvailable

func (mn *RedisDataManager) IsAvailable() bool

IsAvailable methods that checks whether DataContext could be used or not

Availability means that redisClient is not NULL and Ready for receive requests
* Parameters: no
* Returns true if DataContext is available

func (*RedisDataManager) SetPassword

func (mn *RedisDataManager) SetPassword(realmName string, userName string, password string) error

SetPassword - setting a password for user

  • Arguments:
  • - realmName
  • - userName
  • - password - string
  • Returns: error

func (*RedisDataManager) UpdateClient

func (mn *RedisDataManager) UpdateClient(realmName string, clientName string, clientNew data.Client) error

UpdateClient - updating an existing client

  1. Removes Client fully from clients and realm clients collections * 2. Creates client with new body (clientNew) * 3. Add relations between Realm and Client * Arguments: * - realmName - name of a realm * - clientName - name of a client * - clientNew - new client body * Returns: error

func (*RedisDataManager) UpdateRealm

func (mn *RedisDataManager) UpdateRealm(realmName string, realmNew data.Realm) error

UpdateRealm - realm update. It is expected that realmValue will not contain clients and users.

If the name or id of the realm has changed.  Then this information will be cascaded to all dependent objects.
* Arguments:
*    - realmName
*    - realmNew
* Returns: error

func (*RedisDataManager) UpdateUser

func (mn *RedisDataManager) UpdateUser(realmName string, userName string, userNew data.User) error

UpdateUser - upgrading an existing user

  • Arguments:
  • - realmName
  • - userName
  • - userNew
  • Returns: error

func (*RedisDataManager) UpdateUserFederationConfig

func (mn *RedisDataManager) UpdateUserFederationConfig(realmName string, configName string, userFederationConfig data.UserFederationServiceConfig) error

UpdateUserFederationConfig - updating an existing data.UserFederationServiceConfig

 Just upsert object
* Arguments:
*    - realmName - name of a data.Realm
*    - configName - name of a data.UserFederationServiceConfig
*    - userFederationConfig - new User Federation Service Config body
* Returns: error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL