Documentation
¶
Index ¶
- Constants
- type RedisDataManager
- func (mn *RedisDataManager) CreateClient(realmName string, clientNew data.Client) error
- func (mn *RedisDataManager) CreateRealm(newRealm data.Realm) error
- func (mn *RedisDataManager) CreateUser(realmName string, userNew data.User) error
- func (mn *RedisDataManager) CreateUserFederationConfig(realmName string, userFederationConfig data.UserFederationServiceConfig) error
- func (mn *RedisDataManager) DeleteClient(realmName string, clientName string) error
- func (mn *RedisDataManager) DeleteRealm(realmName string) error
- func (mn *RedisDataManager) DeleteUser(realmName string, userName string) error
- func (mn *RedisDataManager) DeleteUserFederationConfig(realmName string, configName string) error
- func (mn *RedisDataManager) GetClient(realmName string, clientName string) (*data.Client, error)
- func (mn *RedisDataManager) GetClients(realmName string) ([]data.Client, error)
- func (mn *RedisDataManager) GetRealm(realmName string) (*data.Realm, error)
- func (mn *RedisDataManager) GetUser(realmName string, userName string) (data.User, error)
- func (mn *RedisDataManager) GetUserById(realmName string, userId uuid.UUID) (data.User, error)
- func (mn *RedisDataManager) GetUserFederationConfig(realmName string, configName string) (*data.UserFederationServiceConfig, error)
- func (mn *RedisDataManager) GetUserFederationConfigs(realmName string) ([]data.UserFederationServiceConfig, error)
- func (mn *RedisDataManager) GetUsers(realmName string) ([]data.User, error)
- func (mn *RedisDataManager) IsAvailable() bool
- func (mn *RedisDataManager) SetPassword(realmName string, userName string, password string) error
- func (mn *RedisDataManager) UpdateClient(realmName string, clientName string, clientNew data.Client) error
- func (mn *RedisDataManager) UpdateRealm(realmName string, realmNew data.Realm) error
- func (mn *RedisDataManager) UpdateUser(realmName string, userName string, userNew data.User) error
- func (mn *RedisDataManager) UpdateUserFederationConfig(realmName string, configName string, ...) error
Constants ¶
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
- 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 ¶
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
- 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 ¶
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 ¶
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
- 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 ¶
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