keycloak
公開メンバ関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider クラス
org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider の継承関係図
Inheritance graph
org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider 連携図
Collaboration graph

公開メンバ関数

 JpaUserSessionPersisterProvider (KeycloakSession session, EntityManager em)
 
void createUserSession (UserSessionModel userSession, boolean offline)
 
void createClientSession (AuthenticatedClientSessionModel clientSession, boolean offline)
 
void updateUserSession (UserSessionModel userSession, boolean offline)
 
void removeUserSession (String userSessionId, boolean offline)
 
void removeClientSession (String userSessionId, String clientUUID, boolean offline)
 
void onRealmRemoved (RealmModel realm)
 
void onClientRemoved (RealmModel realm, ClientModel client)
 
void onUserRemoved (RealmModel realm, UserModel user)
 
void clearDetachedUserSessions ()
 
void updateAllTimestamps (int time)
 
List< UserSessionModelloadUserSessions (int firstResult, int maxResults, boolean offline)
 
int getUserSessionsCount (boolean offline)
 
void close ()
 

非公開メンバ関数

List< PersistentClientSessionEntitygetClientSessionsByUserSession (String userSessionId, boolean offline)
 
void onClientRemoved (String clientUUID)
 
void onUserRemoved (RealmModel realm, String userId)
 
PersistentUserSessionAdapter toAdapter (RealmModel realm, PersistentUserSessionEntity entity)
 
PersistentAuthenticatedClientSessionAdapter toAdapter (RealmModel realm, PersistentUserSessionAdapter userSession, PersistentClientSessionEntity entity)
 
String offlineToString (boolean offline)
 
boolean offlineFromString (String offlineStr)
 

非公開変数類

final KeycloakSession session
 
final EntityManager em
 

静的非公開変数類

static final Logger logger = Logger.getLogger(JpaUserSessionPersisterProvider.class)
 

詳解

著者
Marek Posolda

構築子と解体子

◆ JpaUserSessionPersisterProvider()

org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.JpaUserSessionPersisterProvider ( KeycloakSession  session,
EntityManager  em 
)
inline
54  {
55  this.session = session;
56  this.em = em;
57  }
final KeycloakSession session
Definition: JpaUserSessionPersisterProvider.java:51
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

関数詳解

◆ clearDetachedUserSessions()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.clearDetachedUserSessions ( )
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

217  {
218  int num = em.createNamedQuery("deleteDetachedClientSessions").executeUpdate();
219  num = em.createNamedQuery("deleteDetachedUserSessions").executeUpdate();
220  }
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ close()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.close ( )
inline

org.keycloak.provider.Providerを実装しています。

342  {
343 
344  }

◆ createClientSession()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.createClientSession ( AuthenticatedClientSessionModel  clientSession,
boolean  offline 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

77  {
78  PersistentAuthenticatedClientSessionAdapter adapter = new PersistentAuthenticatedClientSessionAdapter(clientSession);
79  PersistentClientSessionModel model = adapter.getUpdatedModel();
80 
81  PersistentClientSessionEntity entity = new PersistentClientSessionEntity();
82  StorageId clientStorageId = new StorageId(clientSession.getClient().getId());
83  if (clientStorageId.isLocal()) {
84  entity.setClientId(clientStorageId.getId());
85  entity.setClientStorageProvider(PersistentClientSessionEntity.LOCAL);
86  entity.setExternalClientId(PersistentClientSessionEntity.LOCAL);
87 
88  } else {
89  entity.setClientId(PersistentClientSessionEntity.EXTERNAL);
90  entity.setClientStorageProvider(clientStorageId.getProviderId());
91  entity.setExternalClientId(clientStorageId.getExternalId());
92  }
93  entity.setTimestamp(clientSession.getTimestamp());
94  String offlineStr = offlineToString(offline);
95  entity.setOffline(offlineStr);
96  entity.setUserSessionId(clientSession.getUserSession().getId());
97  entity.setData(model.getData());
98  em.persist(entity);
99  em.flush();
100  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ createUserSession()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.createUserSession ( UserSessionModel  userSession,
boolean  offline 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

60  {
61  PersistentUserSessionAdapter adapter = new PersistentUserSessionAdapter(userSession);
62  PersistentUserSessionModel model = adapter.getUpdatedModel();
63 
64  PersistentUserSessionEntity entity = new PersistentUserSessionEntity();
65  entity.setUserSessionId(model.getUserSessionId());
66  entity.setRealmId(adapter.getRealm().getId());
67  entity.setUserId(adapter.getUser().getId());
68  String offlineStr = offlineToString(offline);
69  entity.setOffline(offlineStr);
70  entity.setLastSessionRefresh(model.getLastSessionRefresh());
71  entity.setData(model.getData());
72  em.persist(entity);
73  em.flush();
74  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ getClientSessionsByUserSession()

List<PersistentClientSessionEntity> org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.getClientSessionsByUserSession ( String  userSessionId,
boolean  offline 
)
inlineprivate
170  {
171  String offlineStr = offlineToString(offline);
172 
173  TypedQuery<PersistentClientSessionEntity> query = em.createNamedQuery("findClientSessionsByUserSession", PersistentClientSessionEntity.class);
174  query.setParameter("userSessionId", userSessionId);
175  query.setParameter("offline", offlineStr);
176  return query.getResultList();
177  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ getUserSessionsCount()

int org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.getUserSessionsCount ( boolean  offline)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

332  {
333  String offlineStr = offlineToString(offline);
334 
335  Query query = em.createNamedQuery("findUserSessionsCount");
336  query.setParameter("offline", offlineStr);
337  Number n = (Number) query.getSingleResult();
338  return n.intValue();
339  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ loadUserSessions()

List<UserSessionModel> org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.loadUserSessions ( int  firstResult,
int  maxResults,
boolean  offline 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

229  {
230  String offlineStr = offlineToString(offline);
231 
232  TypedQuery<PersistentUserSessionEntity> query = em.createNamedQuery("findUserSessions", PersistentUserSessionEntity.class);
233  query.setParameter("offline", offlineStr);
234 
235  if (firstResult != -1) {
236  query.setFirstResult(firstResult);
237  }
238  if (maxResults != -1) {
239  query.setMaxResults(maxResults);
240  }
241 
242  List<PersistentUserSessionEntity> results = query.getResultList();
243  List<UserSessionModel> result = new ArrayList<>();
244  List<String> userSessionIds = new ArrayList<>();
245  for (PersistentUserSessionEntity entity : results) {
246  RealmModel realm = session.realms().getRealm(entity.getRealmId());
247  try {
248  UserModel user = session.users().getUserById(entity.getUserId(), realm);
249  // Case when user was deleted in the meantime
250  if (user == null) {
251  onUserRemoved(realm, entity.getUserId());
252  return loadUserSessions(firstResult, maxResults, offline);
253  }
254  } catch (Exception e) {
255  logger.debugv(e,"Failed to load user with id {0}", entity.getUserId());
256  }
257 
258 
259  result.add(toAdapter(realm, entity));
260  userSessionIds.add(entity.getUserSessionId());
261  }
262 
263  Set<String> removedClientUUIDs = new HashSet<>();
264 
265  if (!userSessionIds.isEmpty()) {
266  TypedQuery<PersistentClientSessionEntity> query2 = em.createNamedQuery("findClientSessionsByUserSessions", PersistentClientSessionEntity.class);
267  query2.setParameter("userSessionIds", userSessionIds);
268  query2.setParameter("offline", offlineStr);
269  List<PersistentClientSessionEntity> clientSessions = query2.getResultList();
270 
271  // Assume both userSessions and clientSessions ordered by userSessionId
272  int j = 0;
273  for (UserSessionModel ss : result) {
274  PersistentUserSessionAdapter userSession = (PersistentUserSessionAdapter) ss;
275  Map<String, AuthenticatedClientSessionModel> currentClientSessions = userSession.getAuthenticatedClientSessions(); // This is empty now and we want to fill it
276 
277  boolean next = true;
278  while (next && j < clientSessions.size()) {
279  PersistentClientSessionEntity clientSession = clientSessions.get(j);
280  if (clientSession.getUserSessionId().equals(userSession.getId())) {
281  PersistentAuthenticatedClientSessionAdapter clientSessAdapter = toAdapter(userSession.getRealm(), userSession, clientSession);
282 
283  // Case when client was removed in the meantime
284  if (clientSessAdapter.getClient() == null) {
285  removedClientUUIDs.add(clientSession.getClientId());
286  } else {
287  currentClientSessions.put(clientSession.getClientId(), clientSessAdapter);
288  }
289  j++;
290  } else {
291  next = false;
292  }
293  }
294  }
295  }
296 
297  for (String clientUUID : removedClientUUIDs) {
298  onClientRemoved(clientUUID);
299  }
300 
301  return result;
302  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
RealmModel getRealm(String id)
void onUserRemoved(RealmModel realm, UserModel user)
Definition: JpaUserSessionPersisterProvider.java:207
List< UserSessionModel > loadUserSessions(int firstResult, int maxResults, boolean offline)
Definition: JpaUserSessionPersisterProvider.java:229
final KeycloakSession session
Definition: JpaUserSessionPersisterProvider.java:51
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52
static final Logger logger
Definition: JpaUserSessionPersisterProvider.java:49
PersistentUserSessionAdapter toAdapter(RealmModel realm, PersistentUserSessionEntity entity)
Definition: JpaUserSessionPersisterProvider.java:304
UserModel getUserById(String id, RealmModel realm)
void onClientRemoved(RealmModel realm, ClientModel client)
Definition: JpaUserSessionPersisterProvider.java:188

◆ offlineFromString()

boolean org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.offlineFromString ( String  offlineStr)
inlineprivate
350  {
351  return "1".equals(offlineStr);
352  }

◆ offlineToString()

String org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.offlineToString ( boolean  offline)
inlineprivate
346  {
347  return offline ? "1" : "0";
348  }

◆ onClientRemoved() [1/2]

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.onClientRemoved ( RealmModel  realm,
ClientModel  client 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

188  {
189  onClientRemoved(client.getId());
190  }
void onClientRemoved(RealmModel realm, ClientModel client)
Definition: JpaUserSessionPersisterProvider.java:188

◆ onClientRemoved() [2/2]

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.onClientRemoved ( String  clientUUID)
inlineprivate
192  {
193  int num = 0;
194  StorageId clientStorageId = new StorageId(clientUUID);
195  if (clientStorageId.isLocal()) {
196  num = em.createNamedQuery("deleteClientSessionsByClient").setParameter("clientId", clientUUID).executeUpdate();
197  } else {
198  num = em.createNamedQuery("deleteClientSessionsByExternalClient")
199  .setParameter("clientStorageProvider", clientStorageId.getProviderId())
200  .setParameter("externalClientId", clientStorageId.getExternalId())
201  .executeUpdate();
202  }
203  num = em.createNamedQuery("deleteDetachedUserSessions").executeUpdate();
204  }
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ onRealmRemoved()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.onRealmRemoved ( RealmModel  realm)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

182  {
183  int num = em.createNamedQuery("deleteClientSessionsByRealm").setParameter("realmId", realm.getId()).executeUpdate();
184  num = em.createNamedQuery("deleteUserSessionsByRealm").setParameter("realmId", realm.getId()).executeUpdate();
185  }
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ onUserRemoved() [1/2]

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.onUserRemoved ( RealmModel  realm,
UserModel  user 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

207  {
208  onUserRemoved(realm, user.getId());
209  }
void onUserRemoved(RealmModel realm, UserModel user)
Definition: JpaUserSessionPersisterProvider.java:207

◆ onUserRemoved() [2/2]

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.onUserRemoved ( RealmModel  realm,
String  userId 
)
inlineprivate
211  {
212  int num = em.createNamedQuery("deleteClientSessionsByUser").setParameter("userId", userId).executeUpdate();
213  num = em.createNamedQuery("deleteUserSessionsByUser").setParameter("userId", userId).executeUpdate();
214  }
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ removeClientSession()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.removeClientSession ( String  userSessionId,
String  clientUUID,
boolean  offline 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

139  {
140  String offlineStr = offlineToString(offline);
141  StorageId clientStorageId = new StorageId(clientUUID);
142  String clientId = PersistentClientSessionEntity.EXTERNAL;
143  String clientStorageProvider = PersistentClientSessionEntity.LOCAL;
144  String externalId = PersistentClientSessionEntity.LOCAL;
145  if (clientStorageId.isLocal()) {
146  clientId = clientUUID;
147  } else {
148  clientStorageProvider = clientStorageId.getProviderId();
149  externalId = clientStorageId.getExternalId();
150 
151  }
152  PersistentClientSessionEntity sessionEntity = em.find(PersistentClientSessionEntity.class, new PersistentClientSessionEntity.Key(userSessionId, clientId, clientStorageProvider, externalId, offlineStr));
153  if (sessionEntity != null) {
154  em.remove(sessionEntity);
155 
156  // Remove userSession if it was last clientSession
157  List<PersistentClientSessionEntity> clientSessions = getClientSessionsByUserSession(sessionEntity.getUserSessionId(), offline);
158  if (clientSessions.size() == 0) {
159  offlineStr = offlineToString(offline);
160  PersistentUserSessionEntity userSessionEntity = em.find(PersistentUserSessionEntity.class, new PersistentUserSessionEntity.Key(sessionEntity.getUserSessionId(), offlineStr));
161  if (userSessionEntity != null) {
162  em.remove(userSessionEntity);
163  }
164  }
165 
166  em.flush();
167  }
168  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
List< PersistentClientSessionEntity > getClientSessionsByUserSession(String userSessionId, boolean offline)
Definition: JpaUserSessionPersisterProvider.java:170
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ removeUserSession()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.removeUserSession ( String  userSessionId,
boolean  offline 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

123  {
124  String offlineStr = offlineToString(offline);
125 
126  em.createNamedQuery("deleteClientSessionsByUserSession")
127  .setParameter("userSessionId", userSessionId)
128  .setParameter("offline", offlineStr)
129  .executeUpdate();
130 
131  PersistentUserSessionEntity sessionEntity = em.find(PersistentUserSessionEntity.class, new PersistentUserSessionEntity.Key(userSessionId, offlineStr));
132  if (sessionEntity != null) {
133  em.remove(sessionEntity);
134  em.flush();
135  }
136  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ toAdapter() [1/2]

PersistentUserSessionAdapter org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.toAdapter ( RealmModel  realm,
PersistentUserSessionEntity  entity 
)
inlineprivate
304  {
305  PersistentUserSessionModel model = new PersistentUserSessionModel();
306  model.setUserSessionId(entity.getUserSessionId());
307  model.setLastSessionRefresh(entity.getLastSessionRefresh());
308  model.setData(entity.getData());
309  model.setOffline(offlineFromString(entity.getOffline()));
310 
311  Map<String, AuthenticatedClientSessionModel> clientSessions = new HashMap<>();
312  return new PersistentUserSessionAdapter(session, model, realm, entity.getUserId(), clientSessions);
313  }
boolean offlineFromString(String offlineStr)
Definition: JpaUserSessionPersisterProvider.java:350
final KeycloakSession session
Definition: JpaUserSessionPersisterProvider.java:51

◆ toAdapter() [2/2]

PersistentAuthenticatedClientSessionAdapter org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.toAdapter ( RealmModel  realm,
PersistentUserSessionAdapter  userSession,
PersistentClientSessionEntity  entity 
)
inlineprivate
315  {
316  String clientId = entity.getClientId();
317  if (!entity.getExternalClientId().equals("local")) {
318  clientId = new StorageId(entity.getClientId(), entity.getExternalClientId()).getId();
319  }
320  ClientModel client = realm.getClientById(clientId);
321 
322  PersistentClientSessionModel model = new PersistentClientSessionModel();
323  model.setClientId(clientId);
324  model.setUserSessionId(userSession.getId());
325  model.setUserId(userSession.getUserId());
326  model.setTimestamp(entity.getTimestamp());
327  model.setData(entity.getData());
328  return new PersistentAuthenticatedClientSessionAdapter(model, realm, client, userSession);
329  }

◆ updateAllTimestamps()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.updateAllTimestamps ( int  time)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

223  {
224  int num = em.createNamedQuery("updateClientSessionsTimestamps").setParameter("timestamp", time).executeUpdate();
225  num = em.createNamedQuery("updateUserSessionsTimestamps").setParameter("lastSessionRefresh", time).executeUpdate();
226  }
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

◆ updateUserSession()

void org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.updateUserSession ( UserSessionModel  userSession,
boolean  offline 
)
inline

org.keycloak.models.session.UserSessionPersisterProviderを実装しています。

103  {
104  PersistentUserSessionAdapter adapter;
105  if (userSession instanceof PersistentUserSessionAdapter) {
106  adapter = (PersistentUserSessionAdapter) userSession;
107  } else {
108  adapter = new PersistentUserSessionAdapter(userSession);
109  }
110 
111  PersistentUserSessionModel model = adapter.getUpdatedModel();
112 
113  String offlineStr = offlineToString(offline);
114  PersistentUserSessionEntity entity = em.find(PersistentUserSessionEntity.class, new PersistentUserSessionEntity.Key(userSession.getId(), offlineStr));
115  if (entity == null) {
116  throw new ModelException("UserSession with ID " + userSession.getId() + ", offline: " + offline + " not found");
117  }
118  entity.setLastSessionRefresh(model.getLastSessionRefresh());
119  entity.setData(model.getData());
120  }
String offlineToString(boolean offline)
Definition: JpaUserSessionPersisterProvider.java:346
final EntityManager em
Definition: JpaUserSessionPersisterProvider.java:52

メンバ詳解

◆ em

final EntityManager org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.em
private

◆ logger

final Logger org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.logger = Logger.getLogger(JpaUserSessionPersisterProvider.class)
staticprivate

◆ session

final KeycloakSession org.keycloak.models.jpa.session.JpaUserSessionPersisterProvider.session
private

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