keycloak
クラス | 公開メンバ関数 | 限定公開メンバ関数 | 関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider クラス
org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider の継承関係図
Inheritance graph
org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider 連携図
Collaboration graph

クラス

class  WrapperCallable
 

公開メンバ関数

 InfinispanPublicKeyStorageProvider (KeycloakSession session, Cache< String, PublicKeysEntry > keys, Map< String, FutureTask< PublicKeysEntry >> tasksInProgress, int minTimeBetweenRequests)
 
void clearCache ()
 
PublicKey getPublicKey (String modelKey, String kid, PublicKeyLoader loader)
 
void close ()
 

限定公開メンバ関数

KeycloakTransaction getAfterTransaction ()
 
void runInvalidations ()
 

関数

void addInvalidation (String cacheKey)
 

非公開メンバ関数

PublicKey getPublicKey (Map< String, PublicKey > publicKeys, String kid)
 

非公開変数類

final KeycloakSession session
 
final Cache< String, PublicKeysEntrykeys
 
final Map< String, FutureTask< PublicKeysEntry > > tasksInProgress
 
final int minTimeBetweenRequests
 
Set< String > invalidations = new HashSet<>()
 
boolean transactionEnlisted = false
 

静的非公開変数類

static final Logger log = Logger.getLogger(InfinispanPublicKeyStorageProvider.class)
 

詳解

著者
Marek Posolda

構築子と解体子

◆ InfinispanPublicKeyStorageProvider()

org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.InfinispanPublicKeyStorageProvider ( KeycloakSession  session,
Cache< String, PublicKeysEntry keys,
Map< String, FutureTask< PublicKeysEntry >>  tasksInProgress,
int  minTimeBetweenRequests 
)
inline
59  {
60  this.session = session;
61  this.keys = keys;
64  }
final KeycloakSession session
Definition: InfinispanPublicKeyStorageProvider.java:47
final Map< String, FutureTask< PublicKeysEntry > > tasksInProgress
Definition: InfinispanPublicKeyStorageProvider.java:51
final int minTimeBetweenRequests
Definition: InfinispanPublicKeyStorageProvider.java:53
final Cache< String, PublicKeysEntry > keys
Definition: InfinispanPublicKeyStorageProvider.java:49

関数詳解

◆ addInvalidation()

void org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.addInvalidation ( String  cacheKey)
inlinepackage
75  {
76  if (!transactionEnlisted) {
78  transactionEnlisted = true;
79  }
80 
81  this.invalidations.add(cacheKey);
82  }
KeycloakTransactionManager getTransactionManager()
final KeycloakSession session
Definition: InfinispanPublicKeyStorageProvider.java:47
Set< String > invalidations
Definition: InfinispanPublicKeyStorageProvider.java:55
KeycloakTransaction getAfterTransaction()
Definition: InfinispanPublicKeyStorageProvider.java:85
boolean transactionEnlisted
Definition: InfinispanPublicKeyStorageProvider.java:57
void enlistAfterCompletion(KeycloakTransaction transaction)

◆ clearCache()

void org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.clearCache ( )
inline

org.keycloak.keys.PublicKeyStorageProviderを実装しています。

68  {
69  keys.clear();
70  ClusterProvider cluster = session.getProvider(ClusterProvider.class);
71  cluster.notify(InfinispanPublicKeyStorageProviderFactory.KEYS_CLEAR_CACHE_EVENTS, new ClearCacheEvent(), true, ClusterProvider.DCNotify.ALL_DCS);
72  }
final KeycloakSession session
Definition: InfinispanPublicKeyStorageProvider.java:47
< T extends Provider > T getProvider(Class< T > clazz)
final Cache< String, PublicKeysEntry > keys
Definition: InfinispanPublicKeyStorageProvider.java:49

◆ close()

void org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.close ( )
inline

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

196  {
197 
198  }

◆ getAfterTransaction()

KeycloakTransaction org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.getAfterTransaction ( )
inlineprotected
85  {
86  return new KeycloakTransaction() {
87 
88  @Override
89  public void begin() {
90  }
91 
92  @Override
93  public void commit() {
95  }
96 
97  @Override
98  public void rollback() {
100  }
101 
102  @Override
103  public void setRollbackOnly() {
104  }
105 
106  @Override
107  public boolean getRollbackOnly() {
108  return false;
109  }
110 
111  @Override
112  public boolean isActive() {
113  return true;
114  }
115  };
116  }
void runInvalidations()
Definition: InfinispanPublicKeyStorageProvider.java:119

◆ getPublicKey() [1/2]

PublicKey org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.getPublicKey ( String  modelKey,
String  kid,
PublicKeyLoader  loader 
)
inline

org.keycloak.keys.PublicKeyStorageProviderを実装しています。

130  {
131  // Check if key is in cache
132  PublicKeysEntry entry = keys.get(modelKey);
133  if (entry != null) {
134  PublicKey publicKey = getPublicKey(entry.getCurrentKeys(), kid);
135  if (publicKey != null) {
136  return publicKey;
137  }
138  }
139 
140  int lastRequestTime = entry==null ? 0 : entry.getLastRequestTime();
141  int currentTime = Time.currentTime();
142 
143  // Check if we are allowed to send request
144  if (currentTime > lastRequestTime + minTimeBetweenRequests) {
145 
146  WrapperCallable wrapperCallable = new WrapperCallable(modelKey, loader);
147  FutureTask<PublicKeysEntry> task = new FutureTask<>(wrapperCallable);
148  FutureTask<PublicKeysEntry> existing = tasksInProgress.putIfAbsent(modelKey, task);
149 
150  if (existing == null) {
151  task.run();
152  } else {
153  task = existing;
154  }
155 
156  try {
157  entry = task.get();
158 
159  // Computation finished. Let's see if key is available
160  PublicKey publicKey = getPublicKey(entry.getCurrentKeys(), kid);
161  if (publicKey != null) {
162  return publicKey;
163  }
164 
165  } catch (ExecutionException ee) {
166  throw new RuntimeException("Error when loading public keys", ee);
167  } catch (InterruptedException ie) {
168  throw new RuntimeException("Error. Interrupted when loading public keys", ie);
169  } finally {
170  // Our thread inserted the task. Let's clean
171  if (existing == null) {
172  tasksInProgress.remove(modelKey);
173  }
174  }
175  } else {
176  log.warnf("Won't load the keys for model '%s' . Last request time was %d", modelKey, lastRequestTime);
177  }
178 
179  Set<String> availableKids = entry==null ? Collections.emptySet() : entry.getCurrentKeys().keySet();
180  log.warnf("PublicKey wasn't found in the storage. Requested kid: '%s' . Available kids: '%s'", kid, availableKids);
181 
182  return null;
183  }
final Map< String, FutureTask< PublicKeysEntry > > tasksInProgress
Definition: InfinispanPublicKeyStorageProvider.java:51
final int minTimeBetweenRequests
Definition: InfinispanPublicKeyStorageProvider.java:53
final Cache< String, PublicKeysEntry > keys
Definition: InfinispanPublicKeyStorageProvider.java:49
static final Logger log
Definition: InfinispanPublicKeyStorageProvider.java:45
PublicKey getPublicKey(String modelKey, String kid, PublicKeyLoader loader)
Definition: InfinispanPublicKeyStorageProvider.java:130

◆ getPublicKey() [2/2]

PublicKey org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.getPublicKey ( Map< String, PublicKey >  publicKeys,
String  kid 
)
inlineprivate
185  {
186  // Backwards compatibility
187  if (kid == null && !publicKeys.isEmpty()) {
188  return publicKeys.values().iterator().next();
189  } else {
190  return publicKeys.get(kid);
191  }
192  }

◆ runInvalidations()

void org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.runInvalidations ( )
inlineprotected
119  {
120  ClusterProvider cluster = session.getProvider(ClusterProvider.class);
121 
122  for (String cacheKey : invalidations) {
123  keys.remove(cacheKey);
124  cluster.notify(InfinispanPublicKeyStorageProviderFactory.PUBLIC_KEY_STORAGE_INVALIDATION_EVENT, PublicKeyStorageInvalidationEvent.create(cacheKey), true, ClusterProvider.DCNotify.ALL_DCS);
125  }
126  }
final KeycloakSession session
Definition: InfinispanPublicKeyStorageProvider.java:47
< T extends Provider > T getProvider(Class< T > clazz)
Set< String > invalidations
Definition: InfinispanPublicKeyStorageProvider.java:55
final Cache< String, PublicKeysEntry > keys
Definition: InfinispanPublicKeyStorageProvider.java:49

メンバ詳解

◆ invalidations

Set<String> org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.invalidations = new HashSet<>()
private

◆ keys

final Cache<String, PublicKeysEntry> org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.keys
private

◆ log

final Logger org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.log = Logger.getLogger(InfinispanPublicKeyStorageProvider.class)
staticprivate

◆ minTimeBetweenRequests

final int org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.minTimeBetweenRequests
private

◆ session

final KeycloakSession org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.session
private

◆ tasksInProgress

final Map<String, FutureTask<PublicKeysEntry> > org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.tasksInProgress
private

◆ transactionEnlisted

boolean org.keycloak.keys.infinispan.InfinispanPublicKeyStorageProvider.transactionEnlisted = false
private

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