keycloak
クラス | 公開メンバ関数 | 静的公開変数類 | 限定公開メンバ関数 | 静的限定公開変数類 | 非公開変数類 | 全メンバ一覧
org.keycloak.connections.infinispan.RemoteCacheProvider クラス
org.keycloak.connections.infinispan.RemoteCacheProvider 連携図
Collaboration graph

クラス

class  LoginHandler
 

公開メンバ関数

 RemoteCacheProvider (Config.Scope config, EmbeddedCacheManager cacheManager)
 
RemoteCache getRemoteCache (String cacheName)
 
void stop ()
 

静的公開変数類

static final String SCRIPT_CACHE_NAME = "___script_cache"
 

限定公開メンバ関数

synchronized RemoteCache loadRemoteCache (String cacheName)
 
RemoteCacheManager getOrCreateSecuredRemoteCacheManager (Config.Scope config, String cacheName, RemoteCacheManager origManager)
 

静的限定公開変数類

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

非公開変数類

final Config.Scope config
 
final EmbeddedCacheManager cacheManager
 
final Map< String, RemoteCache > availableCaches = new HashMap<>()
 
final Map< String, RemoteCacheManager > managedManagers = new HashMap<>()
 

詳解

Get either just remoteCache associated with remoteStore associated with infinispan cache of given name. If security is enabled, then return secured remoteCache based on the template provided by remoteStore configuration but with added "authentication" configuration of secured hotrod endpoint (RemoteStore doesn't yet allow to configure "security" of hotrod endpoints)

TODO: Remove this class once we upgrade to infinispan version, which allows to configure security for remoteStore itself

著者
Marek Posolda

構築子と解体子

◆ RemoteCacheProvider()

org.keycloak.connections.infinispan.RemoteCacheProvider.RemoteCacheProvider ( Config.Scope  config,
EmbeddedCacheManager  cacheManager 
)
inline
68  {
69  this.config = config;
71  }
final EmbeddedCacheManager cacheManager
Definition: RemoteCacheProvider.java:61
final Config.Scope config
Definition: RemoteCacheProvider.java:60

関数詳解

◆ getOrCreateSecuredRemoteCacheManager()

RemoteCacheManager org.keycloak.connections.infinispan.RemoteCacheProvider.getOrCreateSecuredRemoteCacheManager ( Config.Scope  config,
String  cacheName,
RemoteCacheManager  origManager 
)
inlineprotected
126  {
127  String serverName = config.get("remoteStoreSecurityServerName", "keycloak-jdg-server");
128  String realm = config.get("remoteStoreSecurityRealm", "AllowScriptManager");
129 
130  String username = config.get("remoteStoreSecurityUsername", "___script_manager");
131  String password = config.get("remoteStoreSecurityPassword", "not-so-secret-password");
132 
133  // Create configuration template from the original configuration provided at remoteStore level
134  Configuration origConfig = origManager.getConfiguration();
135 
136  ConfigurationBuilder cfgBuilder = new ConfigurationBuilder()
137  .read(origConfig);
138 
139  String securedHotRodEndpoint = origConfig.servers().stream()
140  .map(serverConfiguration -> serverConfiguration.host() + ":" + serverConfiguration.port())
141  .collect(Collectors.joining(";"));
142 
143  if (managedManagers.containsKey(securedHotRodEndpoint)) {
144  return managedManagers.get(securedHotRodEndpoint);
145  }
146 
147  logger.infof("Creating secured RemoteCacheManager for Server: '%s', Cache: '%s', Realm: '%s', Username: '%s', Secured HotRod endpoint: '%s'", serverName, cacheName, realm, username, securedHotRodEndpoint);
148 
149  // Workaround as I need a way to override servers and it's not possible to remove existing :/
150  try {
151  Field serversField = cfgBuilder.getClass().getDeclaredField("servers");
152  Reflections.setAccessible(serversField);
153  List origServers = Reflections.getFieldValue(serversField, cfgBuilder, List.class);
154  origServers.clear();
155  } catch (NoSuchFieldException nsfe) {
156  throw new RuntimeException(nsfe);
157  }
158 
159  // Create configuration based on the configuration template from remoteStore. Just add security and override secured endpoint
160  Configuration newConfig = cfgBuilder
161  .addServers(securedHotRodEndpoint)
162  .security()
163  .authentication()
164  .serverName(serverName) //define server name, should be specified in XML configuration on JDG side
165  .saslMechanism("DIGEST-MD5") // define SASL mechanism, in this example we use DIGEST with MD5 hash
166  .callbackHandler(new LoginHandler(username, password.toCharArray(), realm)) // define login handler, implementation defined
167  .enable()
168  .build();
169 
170  final RemoteCacheManager remoteCacheManager = new RemoteCacheManager(newConfig);
171  managedManagers.put(securedHotRodEndpoint, remoteCacheManager);
172  return remoteCacheManager;
173  }
final Map< String, RemoteCacheManager > managedManagers
Definition: RemoteCacheProvider.java:66
final Config.Scope config
Definition: RemoteCacheProvider.java:60
static final Logger logger
Definition: RemoteCacheProvider.java:58

◆ getRemoteCache()

RemoteCache org.keycloak.connections.infinispan.RemoteCacheProvider.getRemoteCache ( String  cacheName)
inline
73  {
74  if (availableCaches.get(cacheName) == null) {
75  synchronized (this) {
76  if (availableCaches.get(cacheName) == null) {
77  RemoteCache remoteCache = loadRemoteCache(cacheName);
78  availableCaches.put(cacheName, remoteCache);
79  }
80  }
81  }
82 
83  return availableCaches.get(cacheName);
84  }
final Map< String, RemoteCache > availableCaches
Definition: RemoteCacheProvider.java:63
synchronized RemoteCache loadRemoteCache(String cacheName)
Definition: RemoteCacheProvider.java:95

◆ loadRemoteCache()

synchronized RemoteCache org.keycloak.connections.infinispan.RemoteCacheProvider.loadRemoteCache ( String  cacheName)
inlineprotected
95  {
96  RemoteCache remoteCache = InfinispanUtil.getRemoteCache(cacheManager.getCache(cacheName));
97 
98  Boolean remoteStoreSecurity = config.getBoolean("remoteStoreSecurityEnabled");
99  if (remoteStoreSecurity == null) {
100  try {
101  logger.debugf("Detecting remote security settings of HotRod server, cache %s. Disable by explicitly setting \"remoteStoreSecurityEnabled\" property in spi=connectionsInfinispan/provider=default", cacheName);
102  remoteStoreSecurity = false;
103  final RemoteCache<Object, Object> scriptCache = remoteCache.getRemoteCacheManager().getCache(SCRIPT_CACHE_NAME);
104  if (scriptCache == null) {
105  logger.debug("Cannot detect remote security settings of HotRod server, disabling.");
106  } else {
107  scriptCache.containsKey("");
108  }
109  } catch (HotRodClientException ex) {
110  logger.debug("Seems that HotRod server requires authentication, enabling.");
111  remoteStoreSecurity = true;
112  }
113  }
114 
115  if (remoteStoreSecurity) {
116  logger.infof("Remote store security for cache %s is enabled. Disable by setting \"remoteStoreSecurityEnabled\" property to \"false\" in spi=connectionsInfinispan/provider=default", cacheName);
117  RemoteCacheManager securedMgr = getOrCreateSecuredRemoteCacheManager(config, cacheName, remoteCache.getRemoteCacheManager());
118  return securedMgr.getCache(remoteCache.getName());
119  } else {
120  logger.infof("Remote store security for cache %s is disabled. If server fails to connect to remote JDG server, enable it.", cacheName);
121  return remoteCache;
122  }
123  }
final EmbeddedCacheManager cacheManager
Definition: RemoteCacheProvider.java:61
RemoteCacheManager getOrCreateSecuredRemoteCacheManager(Config.Scope config, String cacheName, RemoteCacheManager origManager)
Definition: RemoteCacheProvider.java:126
final Config.Scope config
Definition: RemoteCacheProvider.java:60
static final Logger logger
Definition: RemoteCacheProvider.java:58
static final String SCRIPT_CACHE_NAME
Definition: RemoteCacheProvider.java:56

◆ stop()

void org.keycloak.connections.infinispan.RemoteCacheProvider.stop ( )
inline
86  {
87  logger.debugf("Shutdown %d registered secured remoteCache managers", managedManagers.size());
88 
89  for (RemoteCacheManager mgr : managedManagers.values()) {
90  mgr.stop();
91  }
92  }
final Map< String, RemoteCacheManager > managedManagers
Definition: RemoteCacheProvider.java:66
static final Logger logger
Definition: RemoteCacheProvider.java:58

メンバ詳解

◆ availableCaches

final Map<String, RemoteCache> org.keycloak.connections.infinispan.RemoteCacheProvider.availableCaches = new HashMap<>()
private

◆ cacheManager

final EmbeddedCacheManager org.keycloak.connections.infinispan.RemoteCacheProvider.cacheManager
private

◆ config

final Config.Scope org.keycloak.connections.infinispan.RemoteCacheProvider.config
private

◆ logger

final Logger org.keycloak.connections.infinispan.RemoteCacheProvider.logger = Logger.getLogger(RemoteCacheProvider.class)
staticprotected

◆ managedManagers

final Map<String, RemoteCacheManager> org.keycloak.connections.infinispan.RemoteCacheProvider.managedManagers = new HashMap<>()
private

◆ SCRIPT_CACHE_NAME

final String org.keycloak.connections.infinispan.RemoteCacheProvider.SCRIPT_CACHE_NAME = "___script_cache"
static

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