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

公開メンバ関数

 ResourceAdminManager (KeycloakSession session)
 
void logoutUser (URI requestUri, RealmModel realm, UserModel user, KeycloakSession keycloakSession)
 
boolean logoutClientSession (URI requestUri, RealmModel realm, ClientModel resource, AuthenticatedClientSessionModel clientSession)
 
GlobalRequestResult logoutAll (URI requestUri, RealmModel realm)
 
GlobalRequestResult logoutClient (URI requestUri, RealmModel realm, ClientModel resource)
 
GlobalRequestResult pushRealmRevocationPolicy (URI requestUri, RealmModel realm)
 
GlobalRequestResult pushClientRevocationPolicy (URI requestUri, RealmModel realm, ClientModel client)
 
GlobalRequestResult testNodesAvailability (URI requestUri, RealmModel realm, ClientModel client)
 

静的公開メンバ関数

static String resolveUri (URI requestUri, String rootUrl, String uri)
 
static String getManagementUrl (URI requestUri, ClientModel client)
 

限定公開メンバ関数

void logoutUserSessions (URI requestUri, RealmModel realm, List< UserSessionModel > userSessions)
 
boolean logoutClientSessions (URI requestUri, RealmModel realm, ClientModel resource, List< AuthenticatedClientSessionModel > clientSessions)
 
GlobalRequestResult logoutClient (URI requestUri, RealmModel realm, ClientModel resource, int notBefore)
 
boolean sendLogoutRequest (RealmModel realm, ClientModel resource, List< String > adapterSessionIds, List< String > userSessions, int notBefore, String managementUrl)
 
GlobalRequestResult pushRevocationPolicy (URI requestUri, RealmModel realm, ClientModel resource, int notBefore)
 
boolean sendPushRevocationPolicyRequest (RealmModel realm, ClientModel resource, int notBefore, String managementUrl)
 
boolean sendTestNodeAvailabilityRequest (RealmModel realm, ClientModel client, String managementUrl)
 

非公開メンバ関数

List< String > getAllManagementUrls (URI requestUri, ClientModel client)
 
void putClientSessions (MultivaluedHashMap< String, AuthenticatedClientSessionModel > clientSessions, UserSessionModel userSession)
 

非公開変数類

KeycloakSession session
 

静的非公開変数類

static final Logger logger = Logger.getLogger(ResourceAdminManager.class)
 
static final String CLIENT_SESSION_HOST_PROPERTY = "${application.session.host}"
 

詳解

著者
Bill Burke
バージョン
Revision
1

構築子と解体子

◆ ResourceAdminManager()

org.keycloak.services.managers.ResourceAdminManager.ResourceAdminManager ( KeycloakSession  session)
inline
63  {
64  this.session = session;
65  }
KeycloakSession session
Definition: ResourceAdminManager.java:61

関数詳解

◆ getAllManagementUrls()

List<String> org.keycloak.services.managers.ResourceAdminManager.getAllManagementUrls ( URI  requestUri,
ClientModel  client 
)
inlineprivate
87  {
88  String baseMgmtUrl = getManagementUrl(requestUri, client);
89  if (baseMgmtUrl == null) {
90  return Collections.emptyList();
91  }
92 
93  Set<String> registeredNodesHosts = new ClientManager().validateRegisteredNodes(client);
94 
95  // No-cluster setup
96  if (registeredNodesHosts.isEmpty()) {
97  return Arrays.asList(baseMgmtUrl);
98  }
99 
100  List<String> result = new LinkedList<String>();
101  KeycloakUriBuilder uriBuilder = KeycloakUriBuilder.fromUri(baseMgmtUrl);
102  for (String nodeHost : registeredNodesHosts) {
103  String currentNodeUri = uriBuilder.clone().host(nodeHost).build().toString();
104  result.add(currentNodeUri);
105  }
106 
107  return result;
108  }
static String getManagementUrl(URI requestUri, ClientModel client)
Definition: ResourceAdminManager.java:73

◆ getManagementUrl()

static String org.keycloak.services.managers.ResourceAdminManager.getManagementUrl ( URI  requestUri,
ClientModel  client 
)
inlinestatic
73  {
74  String mgmtUrl = client.getManagementUrl();
75  if (mgmtUrl == null || mgmtUrl.equals("")) {
76  return null;
77  }
78 
79  String absoluteURI = ResolveRelative.resolveRelativeUri(requestUri, client.getRootUrl(), mgmtUrl);
80 
81  // this is for resolving URI like "http://${jboss.host.name}:8080/..." in order to send request to same machine and avoid request to LB in cluster environment
82  return StringPropertyReplacer.replaceProperties(absoluteURI);
83  }

◆ logoutAll()

GlobalRequestResult org.keycloak.services.managers.ResourceAdminManager.logoutAll ( URI  requestUri,
RealmModel  realm 
)
inline
198  {
199  realm.setNotBefore(Time.currentTime());
200  List<ClientModel> resources = realm.getClients();
201  logger.debugv("logging out {0} resources ", resources.size());
202 
203  GlobalRequestResult finalResult = new GlobalRequestResult();
204  for (ClientModel resource : resources) {
205  GlobalRequestResult currentResult = logoutClient(requestUri, realm, resource, realm.getNotBefore());
206  finalResult.addAll(currentResult);
207  }
208  return finalResult;
209  }
GlobalRequestResult logoutClient(URI requestUri, RealmModel realm, ClientModel resource)
Definition: ResourceAdminManager.java:211
static final Logger logger
Definition: ResourceAdminManager.java:58

◆ logoutClient() [1/2]

GlobalRequestResult org.keycloak.services.managers.ResourceAdminManager.logoutClient ( URI  requestUri,
RealmModel  realm,
ClientModel  resource 
)
inline
211  {
212  resource.setNotBefore(Time.currentTime());
213  return logoutClient(requestUri, realm, resource, resource.getNotBefore());
214  }
GlobalRequestResult logoutClient(URI requestUri, RealmModel realm, ClientModel resource)
Definition: ResourceAdminManager.java:211

◆ logoutClient() [2/2]

GlobalRequestResult org.keycloak.services.managers.ResourceAdminManager.logoutClient ( URI  requestUri,
RealmModel  realm,
ClientModel  resource,
int  notBefore 
)
inlineprotected
217  {
218  List<String> mgmtUrls = getAllManagementUrls(requestUri, resource);
219  if (mgmtUrls.isEmpty()) {
220  logger.debug("No management URL or no registered cluster nodes for the client " + resource.getClientId());
221  return new GlobalRequestResult();
222  }
223 
224  if (logger.isDebugEnabled()) logger.debug("Send logoutClient for URLs: " + mgmtUrls);
225 
226  // Propagate this to all hosts
227  GlobalRequestResult result = new GlobalRequestResult();
228  for (String mgmtUrl : mgmtUrls) {
229  if (sendLogoutRequest(realm, resource, null, null, notBefore, mgmtUrl)) {
230  result.addSuccessRequest(mgmtUrl);
231  } else {
232  result.addFailedRequest(mgmtUrl);
233  }
234  }
235  return result;
236  }
boolean sendLogoutRequest(RealmModel realm, ClientModel resource, List< String > adapterSessionIds, List< String > userSessions, int notBefore, String managementUrl)
Definition: ResourceAdminManager.java:238
static final Logger logger
Definition: ResourceAdminManager.java:58
List< String > getAllManagementUrls(URI requestUri, ClientModel client)
Definition: ResourceAdminManager.java:87

◆ logoutClientSession()

boolean org.keycloak.services.managers.ResourceAdminManager.logoutClientSession ( URI  requestUri,
RealmModel  realm,
ClientModel  resource,
AuthenticatedClientSessionModel  clientSession 
)
inline
142  {
143  return logoutClientSessions(requestUri, realm, resource, Arrays.asList(clientSession));
144  }
boolean logoutClientSessions(URI requestUri, RealmModel realm, ClientModel resource, List< AuthenticatedClientSessionModel > clientSessions)
Definition: ResourceAdminManager.java:146

◆ logoutClientSessions()

boolean org.keycloak.services.managers.ResourceAdminManager.logoutClientSessions ( URI  requestUri,
RealmModel  realm,
ClientModel  resource,
List< AuthenticatedClientSessionModel >  clientSessions 
)
inlineprotected
146  {
147  String managementUrl = getManagementUrl(requestUri, resource);
148  if (managementUrl != null) {
149 
150  // Key is host, value is list of http sessions for this host
151  MultivaluedHashMap<String, String> adapterSessionIds = null;
152  List<String> userSessions = new LinkedList<>();
153  if (clientSessions != null && clientSessions.size() > 0) {
154  adapterSessionIds = new MultivaluedHashMap<String, String>();
155  for (AuthenticatedClientSessionModel clientSession : clientSessions) {
156  String adapterSessionId = clientSession.getNote(AdapterConstants.CLIENT_SESSION_STATE);
157  if (adapterSessionId != null) {
158  String host = clientSession.getNote(AdapterConstants.CLIENT_SESSION_HOST);
159  adapterSessionIds.add(host, adapterSessionId);
160  }
161  if (clientSession.getUserSession() != null) userSessions.add(clientSession.getUserSession().getId());
162  }
163  }
164 
165  if (adapterSessionIds == null || adapterSessionIds.isEmpty()) {
166  logger.debugv("Can't logout {0}: no logged adapter sessions", resource.getClientId());
167  return false;
168  }
169 
170  if (managementUrl.contains(CLIENT_SESSION_HOST_PROPERTY)) {
171  boolean allPassed = true;
172  // Send logout separately to each host (needed for single-sign-out in cluster for non-distributable apps - KEYCLOAK-748)
173  for (Map.Entry<String, List<String>> entry : adapterSessionIds.entrySet()) {
174  String host = entry.getKey();
175  List<String> sessionIds = entry.getValue();
176  String currentHostMgmtUrl = managementUrl.replace(CLIENT_SESSION_HOST_PROPERTY, host);
177  allPassed = sendLogoutRequest(realm, resource, sessionIds, userSessions, 0, currentHostMgmtUrl) && allPassed;
178  }
179 
180  return allPassed;
181  } else {
182  // Send single logout request
183  List<String> allSessionIds = new ArrayList<String>();
184  for (List<String> currentIds : adapterSessionIds.values()) {
185  allSessionIds.addAll(currentIds);
186  }
187 
188  return sendLogoutRequest(realm, resource, allSessionIds, userSessions, 0, managementUrl);
189  }
190  } else {
191  logger.debugv("Can't logout {0}: no management url", resource.getClientId());
192  return false;
193  }
194  }
static final String CLIENT_SESSION_HOST_PROPERTY
Definition: ResourceAdminManager.java:59
static String getManagementUrl(URI requestUri, ClientModel client)
Definition: ResourceAdminManager.java:73
boolean sendLogoutRequest(RealmModel realm, ClientModel resource, List< String > adapterSessionIds, List< String > userSessions, int notBefore, String managementUrl)
Definition: ResourceAdminManager.java:238
static final Logger logger
Definition: ResourceAdminManager.java:58

◆ logoutUser()

void org.keycloak.services.managers.ResourceAdminManager.logoutUser ( URI  requestUri,
RealmModel  realm,
UserModel  user,
KeycloakSession  keycloakSession 
)
inline
110  {
111  keycloakSession.users().setNotBeforeForUser(realm, user, Time.currentTime());
112 
113  List<UserSessionModel> userSessions = keycloakSession.sessions().getUserSessions(realm, user);
114  logoutUserSessions(requestUri, realm, userSessions);
115  }
void logoutUserSessions(URI requestUri, RealmModel realm, List< UserSessionModel > userSessions)
Definition: ResourceAdminManager.java:117

◆ logoutUserSessions()

void org.keycloak.services.managers.ResourceAdminManager.logoutUserSessions ( URI  requestUri,
RealmModel  realm,
List< UserSessionModel >  userSessions 
)
inlineprotected
117  {
118  // Map from "app" to clientSessions for this app
119  MultivaluedHashMap<String, AuthenticatedClientSessionModel> clientSessions = new MultivaluedHashMap<>();
120  for (UserSessionModel userSession : userSessions) {
121  putClientSessions(clientSessions, userSession);
122  }
123 
124  logger.debugv("logging out {0} resources ", clientSessions.size());
125  //logger.infov("logging out resources: {0}", clientSessions);
126 
127  for (Map.Entry<String, List<AuthenticatedClientSessionModel>> entry : clientSessions.entrySet()) {
128  if (entry.getValue().size() == 0) {
129  continue;
130  }
131  logoutClientSessions(requestUri, realm, entry.getValue().get(0).getClient(), entry.getValue());
132  }
133  }
boolean logoutClientSessions(URI requestUri, RealmModel realm, ClientModel resource, List< AuthenticatedClientSessionModel > clientSessions)
Definition: ResourceAdminManager.java:146
void putClientSessions(MultivaluedHashMap< String, AuthenticatedClientSessionModel > clientSessions, UserSessionModel userSession)
Definition: ResourceAdminManager.java:135
static final Logger logger
Definition: ResourceAdminManager.java:58

◆ pushClientRevocationPolicy()

GlobalRequestResult org.keycloak.services.managers.ResourceAdminManager.pushClientRevocationPolicy ( URI  requestUri,
RealmModel  realm,
ClientModel  client 
)
inline
263  {
264  return pushRevocationPolicy(requestUri, realm, client, client.getNotBefore());
265  }
GlobalRequestResult pushRevocationPolicy(URI requestUri, RealmModel realm, ClientModel resource, int notBefore)
Definition: ResourceAdminManager.java:268

◆ pushRealmRevocationPolicy()

GlobalRequestResult org.keycloak.services.managers.ResourceAdminManager.pushRealmRevocationPolicy ( URI  requestUri,
RealmModel  realm 
)
inline
254  {
255  GlobalRequestResult finalResult = new GlobalRequestResult();
256  for (ClientModel client : realm.getClients()) {
257  GlobalRequestResult currentResult = pushRevocationPolicy(requestUri, realm, client, realm.getNotBefore());
258  finalResult.addAll(currentResult);
259  }
260  return finalResult;
261  }
GlobalRequestResult pushRevocationPolicy(URI requestUri, RealmModel realm, ClientModel resource, int notBefore)
Definition: ResourceAdminManager.java:268

◆ pushRevocationPolicy()

GlobalRequestResult org.keycloak.services.managers.ResourceAdminManager.pushRevocationPolicy ( URI  requestUri,
RealmModel  realm,
ClientModel  resource,
int  notBefore 
)
inlineprotected
268  {
269  List<String> mgmtUrls = getAllManagementUrls(requestUri, resource);
270  if (mgmtUrls.isEmpty()) {
271  logger.debugf("No management URL or no registered cluster nodes for the client %s", resource.getClientId());
272  return new GlobalRequestResult();
273  }
274 
275  if (logger.isDebugEnabled()) logger.debug("Sending push revocation to URLS: " + mgmtUrls);
276 
277  // Propagate this to all hosts
278  GlobalRequestResult result = new GlobalRequestResult();
279  for (String mgmtUrl : mgmtUrls) {
280  if (sendPushRevocationPolicyRequest(realm, resource, notBefore, mgmtUrl)) {
281  result.addSuccessRequest(mgmtUrl);
282  } else {
283  result.addFailedRequest(mgmtUrl);
284  }
285  }
286  return result;
287  }
static final Logger logger
Definition: ResourceAdminManager.java:58
boolean sendPushRevocationPolicyRequest(RealmModel realm, ClientModel resource, int notBefore, String managementUrl)
Definition: ResourceAdminManager.java:289
List< String > getAllManagementUrls(URI requestUri, ClientModel client)
Definition: ResourceAdminManager.java:87

◆ putClientSessions()

void org.keycloak.services.managers.ResourceAdminManager.putClientSessions ( MultivaluedHashMap< String, AuthenticatedClientSessionModel >  clientSessions,
UserSessionModel  userSession 
)
inlineprivate
135  {
136  for (Map.Entry<String, AuthenticatedClientSessionModel> entry : userSession.getAuthenticatedClientSessions().entrySet()) {
137  clientSessions.add(entry.getKey(), entry.getValue());
138  }
139  }

◆ resolveUri()

static String org.keycloak.services.managers.ResourceAdminManager.resolveUri ( URI  requestUri,
String  rootUrl,
String  uri 
)
inlinestatic
67  {
68  String absoluteURI = ResolveRelative.resolveRelativeUri(requestUri, rootUrl, uri);
69  return StringPropertyReplacer.replaceProperties(absoluteURI);
70 
71  }

◆ sendLogoutRequest()

boolean org.keycloak.services.managers.ResourceAdminManager.sendLogoutRequest ( RealmModel  realm,
ClientModel  resource,
List< String >  adapterSessionIds,
List< String >  userSessions,
int  notBefore,
String  managementUrl 
)
inlineprotected
238  {
239  LogoutAction adminAction = new LogoutAction(TokenIdGenerator.generateId(), Time.currentTime() + 30, resource.getClientId(), adapterSessionIds, notBefore, userSessions);
240  String token = session.tokens().encode(adminAction);
241  if (logger.isDebugEnabled()) logger.debugv("logout resource {0} url: {1} sessionIds: " + adapterSessionIds, resource.getClientId(), managementUrl);
242  URI target = UriBuilder.fromUri(managementUrl).path(AdapterConstants.K_LOGOUT).build();
243  try {
244  int status = session.getProvider(HttpClientProvider.class).postText(target.toString(), token);
245  boolean success = status == 204 || status == 200;
246  logger.debugf("logout success for %s: %s", managementUrl, success);
247  return success;
248  } catch (IOException e) {
249  ServicesLogger.LOGGER.logoutFailed(e, resource.getClientId());
250  return false;
251  }
252  }
static final Logger logger
Definition: ResourceAdminManager.java:58
KeycloakSession session
Definition: ResourceAdminManager.java:61

◆ sendPushRevocationPolicyRequest()

boolean org.keycloak.services.managers.ResourceAdminManager.sendPushRevocationPolicyRequest ( RealmModel  realm,
ClientModel  resource,
int  notBefore,
String  managementUrl 
)
inlineprotected
289  {
290  String protocol = resource.getProtocol();
291  if (protocol == null) {
292  protocol = OIDCLoginProtocol.LOGIN_PROTOCOL;
293  }
294  LoginProtocol loginProtocol = (LoginProtocol) session.getProvider(LoginProtocol.class, protocol);
295  return loginProtocol == null
296  ? false
297  : loginProtocol.sendPushRevocationPolicyRequest(realm, resource, notBefore, managementUrl);
298  }
KeycloakSession session
Definition: ResourceAdminManager.java:61

◆ sendTestNodeAvailabilityRequest()

boolean org.keycloak.services.managers.ResourceAdminManager.sendTestNodeAvailabilityRequest ( RealmModel  realm,
ClientModel  client,
String  managementUrl 
)
inlineprotected
322  {
323  TestAvailabilityAction adminAction = new TestAvailabilityAction(TokenIdGenerator.generateId(), Time.currentTime() + 30, client.getClientId());
324  String token = session.tokens().encode(adminAction);
325  logger.debugv("testNodes availability resource: {0} url: {1}", client.getClientId(), managementUrl);
326  URI target = UriBuilder.fromUri(managementUrl).path(AdapterConstants.K_TEST_AVAILABLE).build();
327  try {
328  int status = session.getProvider(HttpClientProvider.class).postText(target.toString(), token);
329  boolean success = status == 204 || status == 200;
330  logger.debugf("testAvailability success for %s: %s", managementUrl, success);
331  return success;
332  } catch (IOException e) {
333  ServicesLogger.LOGGER.availabilityTestFailed(managementUrl);
334  return false;
335  }
336  }
static final Logger logger
Definition: ResourceAdminManager.java:58
KeycloakSession session
Definition: ResourceAdminManager.java:61

◆ testNodesAvailability()

GlobalRequestResult org.keycloak.services.managers.ResourceAdminManager.testNodesAvailability ( URI  requestUri,
RealmModel  realm,
ClientModel  client 
)
inline
300  {
301  List<String> mgmtUrls = getAllManagementUrls(requestUri, client);
302  if (mgmtUrls.isEmpty()) {
303  logger.debug("No management URL or no registered cluster nodes for the application " + client.getClientId());
304  return new GlobalRequestResult();
305  }
306 
307 
308  if (logger.isDebugEnabled()) logger.debug("Sending test nodes availability: " + mgmtUrls);
309 
310  // Propagate this to all hosts
311  GlobalRequestResult result = new GlobalRequestResult();
312  for (String mgmtUrl : mgmtUrls) {
313  if (sendTestNodeAvailabilityRequest(realm, client, mgmtUrl)) {
314  result.addSuccessRequest(mgmtUrl);
315  } else {
316  result.addFailedRequest(mgmtUrl);
317  }
318  }
319  return result;
320  }
static final Logger logger
Definition: ResourceAdminManager.java:58
boolean sendTestNodeAvailabilityRequest(RealmModel realm, ClientModel client, String managementUrl)
Definition: ResourceAdminManager.java:322
List< String > getAllManagementUrls(URI requestUri, ClientModel client)
Definition: ResourceAdminManager.java:87

メンバ詳解

◆ CLIENT_SESSION_HOST_PROPERTY

final String org.keycloak.services.managers.ResourceAdminManager.CLIENT_SESSION_HOST_PROPERTY = "${application.session.host}"
staticprivate

◆ logger

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

◆ session

KeycloakSession org.keycloak.services.managers.ResourceAdminManager.session
private

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