keycloak-service
クラス | 公開メンバ関数 | 限定公開メンバ関数 | 非公開メンバ関数 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.services.managers.UserStorageSyncManager クラス
org.keycloak.services.managers.UserStorageSyncManager 連携図
Collaboration graph

クラス

class  Holder
 
class  UserStorageClusterListener
 
class  UserStorageProviderClusterEvent
 

公開メンバ関数

void bootstrapPeriodic (final KeycloakSessionFactory sessionFactory, final TimerProvider timer)
 
SynchronizationResult syncAllUsers (final KeycloakSessionFactory sessionFactory, final String realmId, final UserStorageProviderModel provider)
 
SynchronizationResult syncChangedUsers (final KeycloakSessionFactory sessionFactory, final String realmId, final UserStorageProviderModel provider)
 
void notifyToRefreshPeriodicSync (KeycloakSession session, RealmModel realm, UserStorageProviderModel provider, boolean removed)
 

限定公開メンバ関数

void refreshPeriodicSyncForProvider (final KeycloakSessionFactory sessionFactory, TimerProvider timer, final UserStorageProviderModel provider, final String realmId)
 
void removePeriodicSyncForProvider (TimerProvider timer, UserStorageProviderModel fedProvider)
 

非公開メンバ関数

boolean shouldPerformNewPeriodicSync (int lastSyncTime, int period)
 
void updateLastSyncInterval (final KeycloakSessionFactory sessionFactory, UserStorageProviderModel provider, final String realmId)
 

静的非公開変数類

static final String USER_STORAGE_TASK_KEY = "user-storage"
 
static final Logger logger = Logger.getLogger(UserStorageSyncManager.class)
 

詳解

著者
Marek Posolda

関数詳解

◆ bootstrapPeriodic()

void org.keycloak.services.managers.UserStorageSyncManager.bootstrapPeriodic ( final KeycloakSessionFactory  sessionFactory,
final TimerProvider  timer 
)
inline

Check federationProviderModel of all realms and possibly start periodic sync for them

引数
sessionFactory
timer
56  {
57  KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
58 
59  @Override
60  public void run(KeycloakSession session) {
61  List<RealmModel> realms = session.realms().getRealms();
62  for (final RealmModel realm : realms) {
63  List<UserStorageProviderModel> providers = realm.getUserStorageProviders();
64  for (final UserStorageProviderModel provider : providers) {
65  UserStorageProviderFactory factory = (UserStorageProviderFactory) session.getKeycloakSessionFactory().getProviderFactory(UserStorageProvider.class, provider.getProviderId());
66  if (factory instanceof ImportSynchronization && provider.isImportEnabled()) {
67  refreshPeriodicSyncForProvider(sessionFactory, timer, provider, realm.getId());
68  }
69  }
70  }
71 
72  ClusterProvider clusterProvider = session.getProvider(ClusterProvider.class);
73  clusterProvider.registerListener(USER_STORAGE_TASK_KEY, new UserStorageClusterListener(sessionFactory));
74  }
75  });
76  }
void refreshPeriodicSyncForProvider(final KeycloakSessionFactory sessionFactory, TimerProvider timer, final UserStorageProviderModel provider, final String realmId)
Definition: UserStorageSyncManager.java:179
static final String USER_STORAGE_TASK_KEY
Definition: UserStorageSyncManager.java:46

◆ notifyToRefreshPeriodicSync()

void org.keycloak.services.managers.UserStorageSyncManager.notifyToRefreshPeriodicSync ( KeycloakSession  session,
RealmModel  realm,
UserStorageProviderModel  provider,
boolean  removed 
)
inline
167  {
168  UserStorageProviderFactory factory = (UserStorageProviderFactory) session.getKeycloakSessionFactory().getProviderFactory(UserStorageProvider.class, provider.getProviderId());
169  if (!(factory instanceof ImportSynchronization) || !provider.isImportEnabled()) {
170  return;
171 
172  }
173  UserStorageProviderClusterEvent event = UserStorageProviderClusterEvent.createEvent(removed, realm.getId(), provider);
174  session.getProvider(ClusterProvider.class).notify(USER_STORAGE_TASK_KEY, event, false, ClusterProvider.DCNotify.ALL_DCS);
175  }
static final String USER_STORAGE_TASK_KEY
Definition: UserStorageSyncManager.java:46

◆ refreshPeriodicSyncForProvider()

void org.keycloak.services.managers.UserStorageSyncManager.refreshPeriodicSyncForProvider ( final KeycloakSessionFactory  sessionFactory,
TimerProvider  timer,
final UserStorageProviderModel  provider,
final String  realmId 
)
inlineprotected
179  {
180  logger.debugf("Going to refresh periodic sync for provider '%s' . Full sync period: %d , changed users sync period: %d",
181  provider.getName(), provider.getFullSyncPeriod(), provider.getChangedSyncPeriod());
182 
183  if (provider.getFullSyncPeriod() > 0) {
184  // We want periodic full sync for this provider
185  timer.schedule(new Runnable() {
186 
187  @Override
188  public void run() {
189  try {
190  boolean shouldPerformSync = shouldPerformNewPeriodicSync(provider.getLastSync(), provider.getChangedSyncPeriod());
191  if (shouldPerformSync) {
192  syncAllUsers(sessionFactory, realmId, provider);
193  } else {
194  logger.debugf("Ignored periodic full sync with storage provider %s due small time since last sync", provider.getName());
195  }
196  } catch (Throwable t) {
197  ServicesLogger.LOGGER.errorDuringFullUserSync(t);
198  }
199  }
200 
201  }, provider.getFullSyncPeriod() * 1000, provider.getId() + "-FULL");
202  } else {
203  timer.cancelTask(provider.getId() + "-FULL");
204  }
205 
206  if (provider.getChangedSyncPeriod() > 0) {
207  // We want periodic sync of just changed users for this provider
208  timer.schedule(new Runnable() {
209 
210  @Override
211  public void run() {
212  try {
213  boolean shouldPerformSync = shouldPerformNewPeriodicSync(provider.getLastSync(), provider.getChangedSyncPeriod());
214  if (shouldPerformSync) {
215  syncChangedUsers(sessionFactory, realmId, provider);
216  } else {
217  logger.debugf("Ignored periodic changed-users sync with storage provider %s due small time since last sync", provider.getName());
218  }
219  } catch (Throwable t) {
220  ServicesLogger.LOGGER.errorDuringChangedUserSync(t);
221  }
222  }
223 
224  }, provider.getChangedSyncPeriod() * 1000, provider.getId() + "-CHANGED");
225 
226  } else {
227  timer.cancelTask(provider.getId() + "-CHANGED");
228  }
229  }
SynchronizationResult syncAllUsers(final KeycloakSessionFactory sessionFactory, final String realmId, final UserStorageProviderModel provider)
Definition: UserStorageSyncManager.java:82
boolean shouldPerformNewPeriodicSync(int lastSyncTime, int period)
Definition: UserStorageSyncManager.java:232
static final Logger logger
Definition: UserStorageSyncManager.java:48
SynchronizationResult syncChangedUsers(final KeycloakSessionFactory sessionFactory, final String realmId, final UserStorageProviderModel provider)
Definition: UserStorageSyncManager.java:123

◆ removePeriodicSyncForProvider()

void org.keycloak.services.managers.UserStorageSyncManager.removePeriodicSyncForProvider ( TimerProvider  timer,
UserStorageProviderModel  fedProvider 
)
inlineprotected
244  {
245  logger.debugf("Removing periodic sync for provider %s", fedProvider.getName());
246  timer.cancelTask(fedProvider.getId() + "-FULL");
247  timer.cancelTask(fedProvider.getId() + "-CHANGED");
248  }
static final Logger logger
Definition: UserStorageSyncManager.java:48

◆ shouldPerformNewPeriodicSync()

boolean org.keycloak.services.managers.UserStorageSyncManager.shouldPerformNewPeriodicSync ( int  lastSyncTime,
int  period 
)
inlineprivate
232  {
233  if (lastSyncTime <= 0) {
234  return true;
235  }
236 
237  int currentTime = Time.currentTime();
238  int timeSinceLastSync = currentTime - lastSyncTime;
239 
240  return (timeSinceLastSync * 2 > period);
241  }

◆ syncAllUsers()

SynchronizationResult org.keycloak.services.managers.UserStorageSyncManager.syncAllUsers ( final KeycloakSessionFactory  sessionFactory,
final String  realmId,
final UserStorageProviderModel  provider 
)
inline
82  {
83  UserStorageProviderFactory factory = (UserStorageProviderFactory) sessionFactory.getProviderFactory(UserStorageProvider.class, provider.getProviderId());
84  if (!(factory instanceof ImportSynchronization) || !provider.isImportEnabled() || !provider.isEnabled()) {
85  return SynchronizationResult.ignored();
86 
87  }
88 
89  final Holder holder = new Holder();
90 
91  // Ensure not executed concurrently on this or any other cluster node
92  KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
93 
94  @Override
95  public void run(KeycloakSession session) {
96  ClusterProvider clusterProvider = session.getProvider(ClusterProvider.class);
97  // shared key for "full" and "changed" . Improve if needed
98  String taskKey = provider.getId() + "::sync";
99 
100  // 30 seconds minimal timeout for now
101  int timeout = Math.max(30, provider.getFullSyncPeriod());
102  holder.result = clusterProvider.executeIfNotExecuted(taskKey, timeout, new Callable<SynchronizationResult>() {
103 
104  @Override
105  public SynchronizationResult call() throws Exception {
106  updateLastSyncInterval(sessionFactory, provider, realmId);
107  return ((ImportSynchronization)factory).sync(sessionFactory, realmId, provider);
108  }
109 
110  });
111  }
112 
113  });
114 
115  if (holder.result == null || !holder.result.isExecuted()) {
116  logger.debugf("syncAllUsers for federation provider %s was ignored as it's already in progress", provider.getName());
117  return SynchronizationResult.ignored();
118  } else {
119  return holder.result.getResult();
120  }
121  }
static final Logger logger
Definition: UserStorageSyncManager.java:48
void updateLastSyncInterval(final KeycloakSessionFactory sessionFactory, UserStorageProviderModel provider, final String realmId)
Definition: UserStorageSyncManager.java:251

◆ syncChangedUsers()

SynchronizationResult org.keycloak.services.managers.UserStorageSyncManager.syncChangedUsers ( final KeycloakSessionFactory  sessionFactory,
final String  realmId,
final UserStorageProviderModel  provider 
)
inline
123  {
124  UserStorageProviderFactory factory = (UserStorageProviderFactory) sessionFactory.getProviderFactory(UserStorageProvider.class, provider.getProviderId());
125  if (!(factory instanceof ImportSynchronization) || !provider.isImportEnabled() || !provider.isEnabled()) {
126  return SynchronizationResult.ignored();
127 
128  }
129  final Holder holder = new Holder();
130 
131  // Ensure not executed concurrently on this or any other cluster node
132  KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
133 
134  @Override
135  public void run(KeycloakSession session) {
136  ClusterProvider clusterProvider = session.getProvider(ClusterProvider.class);
137  // shared key for "full" and "changed" . Improve if needed
138  String taskKey = provider.getId() + "::sync";
139 
140  // 30 seconds minimal timeout for now
141  int timeout = Math.max(30, provider.getChangedSyncPeriod());
142  holder.result = clusterProvider.executeIfNotExecuted(taskKey, timeout, new Callable<SynchronizationResult>() {
143 
144  @Override
145  public SynchronizationResult call() throws Exception {
146  // See when we did last sync.
147  int oldLastSync = provider.getLastSync();
148  updateLastSyncInterval(sessionFactory, provider, realmId);
149  return ((ImportSynchronization)factory).syncSince(Time.toDate(oldLastSync), sessionFactory, realmId, provider);
150  }
151 
152  });
153  }
154 
155  });
156 
157  if (holder.result == null || !holder.result.isExecuted()) {
158  logger.debugf("syncChangedUsers for federation provider %s was ignored as it's already in progress", provider.getName());
159  return SynchronizationResult.ignored();
160  } else {
161  return holder.result.getResult();
162  }
163  }
static final Logger logger
Definition: UserStorageSyncManager.java:48
void updateLastSyncInterval(final KeycloakSessionFactory sessionFactory, UserStorageProviderModel provider, final String realmId)
Definition: UserStorageSyncManager.java:251

◆ updateLastSyncInterval()

void org.keycloak.services.managers.UserStorageSyncManager.updateLastSyncInterval ( final KeycloakSessionFactory  sessionFactory,
UserStorageProviderModel  provider,
final String  realmId 
)
inlineprivate
251  {
252  KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
253 
254  @Override
255  public void run(KeycloakSession session) {
256  RealmModel persistentRealm = session.realms().getRealm(realmId);
257  List<UserStorageProviderModel> persistentFedProviders = persistentRealm.getUserStorageProviders();
258  for (UserStorageProviderModel persistentFedProvider : persistentFedProviders) {
259  if (provider.getId().equals(persistentFedProvider.getId())) {
260  // Update persistent provider in DB
261  int lastSync = Time.currentTime();
262  persistentFedProvider.setLastSync(lastSync);
263  persistentRealm.updateComponent(persistentFedProvider);
264 
265  // Update "cached" reference
266  provider.setLastSync(lastSync);
267  }
268  }
269  }
270 
271  });
272  }

メンバ詳解

◆ logger

final Logger org.keycloak.services.managers.UserStorageSyncManager.logger = Logger.getLogger(UserStorageSyncManager.class)
staticprivate

◆ USER_STORAGE_TASK_KEY

final String org.keycloak.services.managers.UserStorageSyncManager.USER_STORAGE_TASK_KEY = "user-storage"
staticprivate

このクラス詳解は次のファイルから抽出されました: