TL; DR: ืืืื ืชืืืืจ ืฉื Keycloak, ืืขืจืืช ืืงืจืช ืืืฉื ืืงืื ืคืชืื, ื ืืชืื ืืืื ื ืืคื ืืื, ืคืจืื ืชืฆืืจื.
ืืืื ืืจืขืืื ืืช ืืจืืืืื
ืืืืืจ ืื ื ืจืื ืืช ืืจืขืืื ืืช ืืืกืืกืืื ืฉืืฉ ืืืืืจ ืืขืช ืคืจืืกืช ืืฉืืื Keycloak ืขื ืืื Kubernetes.
ืื ืืชื ืจืืฆื ืืืขืช ืืืชืจ ืขื Keycloak, ืขืืื ืืงืืฉืืจืื ืืกืืฃ ืืืืืจ. ืืื ืืืชืขืืง ืืืชืจ ืืชืจืืื, ืืชื ืืืื ืืืืื
Keycloak ืืื ืืขืจืืช ืืงืืคื ืืืชืืื ื-Java ืืื ืืื ืขื ืืื ืฉืจืช ืืืฉืืืื
ืื ื ืืืืื ืื ืืชืื ืืงืจืื ืืช ืืจืฉืื
ืืฉืงืช Keycloak
Keycloak ืืืจืฉ ืฉื ื ืืงืืจืืช ื ืชืื ืื ืงืืืขืื ืืื ืืคืขืื:
- ืืกื ื ืชืื ืื ืืืฉืืฉ ืืืืกืื ื ืชืื ืื ืืืืกืกืื, ืืืื ืืืืข ืืฉืชืืฉ
- ืืืืื Datagrid, ืืืฉืืฉ ืืฉืืืจื ืืืืืื ืฉื ื ืชืื ืื ืืืกื ืื ืชืื ืื, ืืื ืื ืืืืกืื ืืื ืืื ื ืชืื ืื ืงืฆืจื ืืืขื ืืืฉืชื ืื ืืขืชืื ืงืจืืืืช, ืืืื ืืคืขืืืช ืฉื ืืฉืชืืฉืื. ืืืืืข
ืืื ืกืืฃ , ืฉืืื ืืืจื ืืื ืืืืจ ืืฉืืขืืชืืช ืืืกื ืื ืชืื ืื. ืืื ืืื ืืงืจื, ืื ืชืื ืื ืฉื ืฉืืจื ื-Infinispan ืื ืืจืขืืื - ืืืื ืฆืืจื ืืฉืืืจ ืืืชื ืืฉืื ืืงืื ืืืฉืจ ืืืฉืืื ืืืคืขื ืืืืฉ.
Keycloak ืคืืขื ืืืจืืขื ืืฆืืื ืฉืื ืื:
- ื ืืจืืื - ืชืืืื ืืื ืืืืื, ืืืืืืจ ืืืืฆืขืืช ืงืืืฅ standalone.xml
- ืืฉืืื ืจืืื (ืืคืฉืจืืช ืืืื ืืช ืืืืื) - ืื ืืชืืืืืื ืืืืืื ืืืฉืชืืฉ ืืืืชื ืชืฆืืจื, ืฉืืฉ ืืกื ืืจื ืืืืคื ืืื ื. ืืืืืจืืช ืืืืืกื ืืช ืืงืืืฅ ืขืฆืืื-ha.xml, ืื ืืกืฃ ืืชื ืฆืจืื ืืขืฉืืช ืืืฉื ืืฉืืชืคืช ืืืกื ืื ืชืื ืื ืืืืื ืขืืืกืื.
- ืืฉืืื ืืืืืื - ืืชืืืช ืืฉืืื ืืืฆื ืจืืื ืืืคืืช ืืืืืจืืช ืืืฉืืื ืฉืืจืชืืช ืืืฉืขืืืช ืืื ืฉืืืฉืืื ืืื, ืฉืื ืืื ืคืขื ืฉืืชืฆืืจื ืืฉืชื ื, ืืฉ ืืืฆืข ืืช ืื ืืฉืื ืืืื ืืื ืฆืืืช ืืฉืืื. ืืฆื ืืคืขืืื ืฉื ืืืืืืื ืคืืชืจ ืืขืื ืื ืขื ืืื ืืืืจืช ืืืงืื ืืืกืื ืืฉืืชืฃ ืืคืจืกืื ืืชืฆืืจื. ืืืืจืืช ืืื ืืืืืกื ืืช ืืงืืืฅ domain.xml
- ืฉืืคืื ืืื ืืจืืื ื ืชืื ืื - ืื ืืชื ืจืืฆื ืืืคืขืื ืืช Keycloak ืืืฉืืื ืฉื ืืกืคืจ ืืจืืื ื ืชืื ืื, ืืจืื ืืืืงืืืื ืืืืืืจืคืืื ืฉืื ืื. ืืืคืฉืจืืช ืื, ืืื ืืจืื ื ืชืื ืื ืืืื ืืฉืืื ืืฉืื ืฉื ืฉืจืชื Keycloak.
ืืืืืจ ืื ื ืฉืงืื ืืคืืจืื ืืช ืืืคืฉืจืืช ืืฉื ืืื, ืืืืืจ ืืฉืืื ืจืืื, ืืื ื ืืืข ืืขื ืื ืืฉื ืฉื ืฉืืคืื ืืื ืืจืืื ื ืชืื ืื, ืฉืื ืืืืื ื ืืืคืขืื ืืช ืฉืชื ืืืคืฉืจืืืืช ืืืื ื-Kubernetes. ืืืจืื ืืืื, ื-Kubernetes ืืื ืืขืื ืขื ืกื ืืจืื ืืืืืจืืช ืฉื ืืกืคืจ ืคืืืื (ืฆืืชื Keycloak), ืื ืืฉืืื ืชืืื ืื ืื ืืืื ืืืื ืงืฉื ืืขืฉืืช.
ืฉืืื ืื ืื ืฉืืืืื ืืฉืืื ืฉืื ืฉืืจ ืืืืืจ ืืืื ืื ืืจืง ืขื ืงืืืฆื ืฉื ืฆืืชืื ืฉื Keycloak ืืคืืขืืื ืืื, ืืื ืฆืืจื ืืืชืืืืก ืืืฉืืื Kubernetes.
ืืฉืืื Keycloak ืจืืื
ืืื ืืืคืขืื ืืช Keycloak ืืืฆื ืื ืืชื ืฆืจืื:
- ืืืืืืจ ืืกื ื ืชืื ืื ืืฉืืชืฃ ืืืฆืื ื
- ืืืชืงืื ืืืื ืขืืืกืื
- ืืฉ ืจืฉืช ืคื ืืืืช ืขื ืชืืืื ื-IP Multicast
ืื ื ืืื ืืืงืืช ืืืืจ ืืืืข ืืืฆืื ื, ืฉืื ืืื ืื ืืืจืช ืืืืจ ืื. ืืื ื ื ืื ืฉืืฉ ืืกืืก ื ืชืื ืื ืขืืื ืืืคืฉืื โ ืืืฉ ืื ื ื ืงืืืช ืืืืืจ ืืืื. ืื ื ืคืฉืื ื ืืกืืฃ ืืช ืื ืชืื ืื ืืืื ืืืฉืชื ื ืืกืืืื.
ืืื ืืืืื ืืื ืืืชืจ ืืืฆื Keycloak ืขืืื ืืืฉืืื ืืฉื (HA), ืืฉืื ืืืขืช ืขื ืืื ืืื ืชืืื ืืืืืืืช ืืืฉืืืืืช ืฉื Wildfly.
Wildfly ืืฉืชืืฉ ืืืกืคืจ ืชืชื ืืขืจืืืช, ืืืงื ืืฉืืฉืืช ืืืืืื ืขืืืกืื, ืืืงื ืืกืืืื ืืช ืชืงืืืช. ืืืื ืืขืืืก ืืืืื ืืืื ืืช ืฉื ืืืฉืืืื ืืืฉืจ ืฆืืืช ืืฉืืื ืขืืืก ืืชืจ ืขื ืืืืื, ืืกืืืื ืืช ืชืงืืืช ืืืืืื ืืืื ืืช ืฉื ืืืฉืืืื ืื ืื ืืื ืฆืืืช ืืฉืืื ื ืืฉืืื. ืืืง ืืชืชื ืืืขืจืืืช ืืืื:
-
mod_cluster
: ืขืืื ืืฉืืืื ืขื Apache ืืืืื ืขืืืก HTTP, ืชืืื ื-TCP Multicast ืืื ืืืฆืื ืืืจืืื ืืืจืืจืช ืืืื. ื ืืชื ืืืืืคื ืืืืืื ืืืฆืื ื. -
infinispan
: ืืืืื ืืืืืจ ืืืฉืชืืฉ ืืขืจืืฆื JGroups ืืฉืืืช ืชืขืืืจื. ืื ืืกืฃ, ืืื ืืืื ืืืฉืชืืฉ ืืคืจืืืืงืื HotRod ืืื ืืชืงืฉืจ ืขื ืืฉืืื Infinispan ืืืฆืื ื ืืื ืืกื ืืจื ืืช ืชืืื ืืืืืื. -
jgroups
: ืืกืคืง ืชืืืื ืืชืงืฉืืจืช ืงืืืฆืชืืช ืขืืืจ ืฉืืจืืชืื ืืืื ืื ืืืืืื ืืืืืกืกืื ืขื ืขืจืืฆื JGroups. ืฆืื ืืจืืช ืืขืื ืฉื ืืืคืฉืจืื ืืืืจ ืืืคืขื ืืืฉืืืื ืืืฉืืื ืืงืืืฆืืช ืื ืฉืืชืงืฉืืจืช ืืฉ ืืืคืืื ืื ืืื ืืืื ืืช, ืกืืจ ืืจืืืฉืืช ืืืฉืืื.
ืืืื ืขืืืกืื
ืืขืช ืืชืงื ืช ืืืืื ืืืงืจ ืื ืืกื ืืืฉืืื Kubernetes, ืืฉืื ืืืืืจ ืืช ืืืืจืื ืืืืื:
Keycloak ืื ืื ืฉืืืชืืืช ืืืจืืืงืช ืฉื ืืืงืื ืืืชืืืจ ืืืืฆืขืืช HTTP ืืฉืจืช ืืืืืืช ืืื ืืชืืืช ื-IP ืืืืืชืืช ืฉื ืืืฉื ืืืงืื. ืืืืจืืช ืืืื ืืื ืืกื ืฆืจืืืืช ืืืืืืจ ืืืชืจืืช HTTP ืืฆืืจื ื ืืื ื X-Forwarded-For
ะธ X-Forwarded-Proto
, ืืื ืืฉืืืจ ืืช ืืืืชืจืช ืืืงืืจืืช HOST
. ืืืจืกื ืืขืืื ืืช ืืืืชืจ ingress-nginx
(>0.22.0)
ืืคืขืืช ืืืื proxy-address-forwarding
ืขื ืืื ืืืืจืช ืืฉืชื ื ืกืืืื PROXY_ADDRESS_FORWARDING
ะฒ true
ื ืืชื ื-Keycloak ืืช ืืืื ื ืฉืืื ืขืืื ืืืืืจื ืคืจืืงืกื.
ืืชื ืฆืจืื ืื ืืืคืขืื ืืคืืฉืื ืืืืงืื ืืื ืืกื. Keycloak ืืฉืชืืฉ ืืืืืื Infinispan ืืืืืจ ืืื ืืืืกื ื ืชืื ืื ืืืฉืืืืื ืืืคืขืืช ืืืืืืช ืื ืืืืืช ืืืืคืขืืช ืืืฉืชืืฉ. ืืืืื ืื ืคืืขืืื ืขื ืืขืืื ืืืื ืืืจืืจืช ืืืื, ืืืืืื ืืืจืืช, ืืืคืขืื ืืืกืืืืช ืืื ืืืืืกื ืช ืืฆืืืช ืืืฉืื ืืืฉืืื, ืืฆืืชืื ืืืจืื ืืืืืื ืืืฆืข ืฉืืืืชืืช ืื ืืจืืืง ืื ืื ืืงืืงืื ืืืืฉื ืืืคืขืื ืื.
ืกืคืฆืืคืืช, ืื ืืืื ืืชืืขืื, ืฆืืจืืฃ ืืคืขืื ืขื ืืฉื cookie ืื ืขืื ืขืืืจื ื
AUTH_SESSION_ID
. ื-Keycloak ืืฉ ืืืืื ืืืคื ืื ืืืืฉ, ืืื ืื ื ืืืืืฆืื ืืืืืจ ืฉื ืงืืืฅ Cookie ืืืจ ืขืืืจ ืืืคืขืื ืืืืืงื.
Keycloak ืืฆืจืฃ ืื ืืช ืฉื ืืฆืืืช ืฉืืืื ืจืืฉืื AUTH_SESSION_ID
, ืืืืืืื ืฉืื ืฆืืืช ืืืจืกื ืืืืื ื ืืืืชืจ ืืฉืชืืฉ ืืืืชื ืืกื ื ืชืื ืื, ืื ืืื ืืื JAVA_OPTS
ืคืจืืืจืื jboss.node.name
ะธ jboss.tx.node.id
ืืืืืื ืืื ืฆืืืช - ืืชื ืืืื, ืืืฉื, ืืฉืื ืืช ืฉื ืืชืจืืื. ืื ืชืื ืืก ืฉื ืชืจืืื, ืื ืชืฉืื ืืช ืืืืืช 23 ืืชืืืื ืขืืืจ ืืฉืชื ื jboss, ืื ืขืืืฃ ืืืฉืชืืฉ ื-StatefulSet ืืื ื-Deployment.
ืืจืืคื ื ืืกืคืช - ืื ืืคืื ื ืืืง ืื ืืืคืขื ืืืืฉ, ืืืืืื ืฉืื ืืื. ืืืชืืฉื ืืื, ืืืื ืืืืืืจ ืืช ืืกืคืจ ืืขืื ืืืืืื ืืื ืืืืืื ืืฉื ืืื ืืคืืืช, ืื ืฉืืืฉืืจ ืขืืชืง ืฉื ืืืืืื. ืืคืชืจืื ืืื ืืจืืฅ /opt/jboss/startup-scripts
ืืืืื:
ืชืืื ืืชืกืจืื
embed-server --server-config=standalone-ha.xml --std-out=echo
batch
echo * Setting CACHE_OWNERS to "${env.CACHE_OWNERS}" in all cache-containers
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
run-batch
stop-embedded-server
ืืืืจ ืืื ืืืืจ ืืช ืืขืจื ืฉื ืืฉืชื ื ืืกืืืื CACHE_OWNERS
ืืืจืืฉ.
ืจืฉืช ืคืจืืืช ืขื ืชืืืื ื-IP Multicast
ืื ืืชื ืืฉืชืืฉ ื-Weavenet ื-CNI, ืฉืืืืจ ืจืืืื ืืคืขื ืืื - ืืฆืืชื ื-Keycloak ืฉืื ืืจืื ืื ืืช ืื ืืจืืข ืฉืื ืืืฉืงื.
ืื ืืื ืื ืชืืืื ื-ip multicast ืืืฉืืื Kubernetes ืฉืื, ืืชื ืืืื ืืืืืืจ ืืช JGroups ืืขืืื ืขื ืคืจืืืืงืืืื ืืืจืื ืืื ืืืฆืื ืฆืืชืื.
ืืืคืฉืจืืช ืืจืืฉืื ื ืืื ืืืฉืชืืฉ KUBE_DNS
ืฉืืฉืชืืฉ headless service
ืืื ืืืฆืื ืฆืืชืื ืฉื Keycloak, ืืชื ืคืฉืื ืืขืืืจ ื-JGroups ืืช ืฉื ืืฉืืจืืช ืฉืืฉืืฉ ืืืฆืืืช ืืฆืืชืื.
ืืคืฉืจืืช ื ืืกืคืช ืืื ืืืฉืชืืฉ ืืฉืืื KUBE_PING
, ืฉืขืืื ืขื ื-API ืืืืคืืฉ ืฆืืชืื (ืขืืื ืืืืืืจ serviceAccount
ืขื ืืืืืืช list
ะธ get
, ืืืืืจ ืืื ืืืืจ ืืช ืืคืืืื ืืขืืื ืขื ืื serviceAccount
).
ืืืจื ืฉืื JGroups ืืืฆืืืช ืฆืืชืื ืืืืืจืช ืขื ืืื ืืืืจืช ืืฉืชื ื ืกืืืื JGROUPS_DISCOVERY_PROTOCOL
ะธ JGROUPS_DISCOVERY_PROPERTIES
. ืขืืืจ KUBE_PING
ืืชื ืฆืจืื ืืืืืจ ืชืจืืืืื ืขื ืืื ืืงืฉื namespace
ะธ labels
.
๏ธ ืื ืืชื ืืฉืชืืฉ ื-multicast ืืืคืขืื ืฉื ื ืืฉืืืืืช Keycloak ืื ืืืชืจ ืืืฉืืื Kubernetes ืืื (ื ื ืื ืืื ืืืจืื ืืฉืืืช
production
, ืืฉื ื -staging
) - ืฆืืชืื ืฉื ืืฉืืื Keycloak ืืื ืืืืืื ืืืฆืืจืฃ ืืืฉืืื ืืืจ. ืืงืคื ืืืฉืชืืฉ ืืืชืืืช ืจืืืื ืฉืืืืจ ืืืืืืืช ืขืืืจ ืื ืืฉืืื ืขื ืืื ืืืืจืช ืืฉืชื ืืjboss.default.multicast.address
ะธjboss.modcluster.multicast.address
ะฒJAVA_OPTS
.
ืฉืืคืื ืืื ืืจืืื ื ืชืื ืื
ืงืฉืจ
Keycloak ืืฉืชืืฉ ืืืกืคืจ ืืฉืืืืืช ืืืืื ื ืคืจืืื ืฉื Infinispan ืขืืืจ ืื ืืจืื ื ืชืื ืื ืฉืื ืืืืงืืื ืืฉืืืืืช Keycloack ืืืืจืืืื ืืฆืืชื Keycloak. ืืื ืืื ืืืื ืืื ืฆืืืช Keycloak ืืืจืืื ื ืชืื ืื ืฉืื ืื.
ืฆืืชื Keycloak ืืฉืชืืฉืื ื-Java Data Grid ืืืฆืื ื (ืฉืจืชื Infinispan) ืืชืงืฉืืจืช ืืื ืืจืืื ื ืชืื ืื. ืืชืงืฉืืจืช ืคืืขืืช ืืคื ืืคืจืืืืงืื
ืืฉ ืืืืืืจ ืืืืื ืื ืฉื Infinispan ืขื ืืชืืื ื remoteStore
, ืื ืฉื ืืชื ืืืืกื ืืช ืื ืชืื ืื ืืจืืืง (ืืืจืื ื ืชืื ืื ืืืจ, ืืฉืืขืจ. ืึฐืชืึผืจืึฐืึธื) ืืืืื ืื. ืืื ืฉืจืชื ื-JDG ืืฉ ืืฉืืืืืช ื ืคืจืืื ืฉื ืืื ืคืื ืืกืคืื, ืื ืฉืื ืชืื ืื ืืืืืืกื ืื ื-JDG1 ืืืชืจ site1
ืืฉืืืคื ื-JDG2 ืืืชืจ site2
.
ืืืืกืืฃ, ืฉืจืช ื-JDG ืืืงืื ืืืืืข ืืฉืจืชื Keycloak ืขื ืืืฉืืื ืฉืื ืืืืฆืขืืช ืืืืืจื ืืงืื, ืฉืืื ืืืคืืื ืฉื ืคืจืืืืงืื HotRod. ืฆืืชื Keycloak ืคืืขืืื site2
ืขืืื ืืช ืืืืื ื ื-Infinispan ืฉืืื ืืืคืขืืช ืืืฉืชืืฉ ืืกืคืฆืืคืืช ืืืคืืช ืืืืื ื ืื ืืฆืืชื Keycloak ื- site2
.
ืขืืืจ ืืืืื ืื ืืกืืืืื, ืืคืฉืจ ืื ืื ืืืฆืข ืืืืืืื ืืืืืื ืข ืืืชืืืช ื ืชืื ืื ืืจื ืฉืจืช Infinispan ืืืืืืื. ืืฉื ืื ืขืืื ืืืกืืจ ืืช ืืืืืจื remote-store
ืืืืื ืกืคืฆืืคื ืฉื Infinispan (ืืงืืืฅ ืขืฆืืื-ha.xml), ืืืืืจ ืืื ืืื ืกืคืฆืืคื replicated-cache
ืื ืื ืืืื ืฆืืจื ืืืชืจ ืืฆื ืฉืจืช Infinispan.
ืืืืจืช ืืืืื ืื
ืืฉื ื ืฉื ื ืกืืืื ืฉื ืืืืื ืื ื-Keycloak:
-
ืึฐืงืึนืึดื. ืืื ืืืืงื ืืื ืืกื ืื ืชืื ืื ืืืฉืืฉ ืืืคืืชืช ืืขืืืก ืขื ืืกื ืื ืชืื ืื, ืืื ืื ืืืคืืชืช ืืื ืืฉืืืืช ืชืืืื. ืกืื ืื ืฉื ืืืืื ืืืืกื ืชืืื, ืืงืืืืช, ืชืคืงืืืื ืืืื ื ืชืื ืื ืฉื ืืฉืชืืฉืื. ืกืื ืื ืฉื ืืืืื ืืื ื ืืฉืืืคื, ืื ืื ืืืืืื ืืื ืืืง ืืืฉืืื Keycloak. ืื ืขืจื ืืืืืื ืืฉืชื ื, ืืืืขื ืขื ืืฉืื ืื ื ืฉืืืช ืืฉืจืชืื ืื ืืชืจืื ืืืฉืืื, ืืืืืจ ืืื ืืขืจื ืืื ื ื ืืื ืืืืืืื. ืจืื ืชืืืืจ
work
ืจืื ืืืื ืืชืืืืจ ืืคืืจื ืืืชืจ ืฉื ืืืืื. -
ืืฉืืืคื. ืืขืื ืืคืขืืืช ืืฉืชืืฉ, ืืกืืืื ืื ืื ืืงืืื ืื, ืืื ืขืืงื ืืืจ ืฉืืืืืช ืืชืืืจืืช ืืื ืืืืืช ื ืืกืืื ืืช ืืืื ืืกืืกืื ืืืชืงืคืืช ืืืจืืช. ืื ืชืื ืื ืืืืืืกื ืื ืืืืืื ืื ืืื ืื ืืื ืืื, ืืืืืกื ืื ืจืง ื-RAM, ืื ื ืืชื ืืฉืืคื ืืืชื ืืจืืื ืืืฉืืื.
ืืืืื ื Infinispan
ืืืฉืืื - ืงืื ืกืคื ื-Keycloak, ืืืืื ืื ื ืคืจืืื ืื ืงืจืืื authenticationSessions
, ืืฉืืฉืื ืืืืกืื ื ืชืื ืื ืฉื ืืฉืชืืฉืื ืกืคืฆืืคืืื. ืืงืฉืืช ืืืืืื ืื ืืื ื ืืืฆืืช ืืืจื ืืื ืขื ืืื ืืืคืืคื ืืฉืจืชื Keycloak, ืื ืขื ืืื ืืืฉืืืื. ืืื ื ืื ืกืช ืืชืืื ื ืืชืืืช ืืกืฉื ืื ืืืืงืื, ืืืื ืฆืืจื ืืฉืืคื ืืืืื ืื ืืืื ืขืฆืื, ืืคืืื ืืืงืจื ืฉื ืืฆื ืืงืืืื-ืืงืืื.
ืืกืืืื ื ืคืขืืื. ืืืฉื ื ืืกืฃ, ืืืฉืืฉ ืืืจื ืืื ืืชืจืืืฉืื ืฉืื ืื ืืืฉืจ, ืืืฉื, ืืืฉืชืืฉ ืืืื ืืขืฉืืช ืืฉืื ืืืืคื ืืกืื ืืจืื ื ืืืืืจ. ืืืฉื, ืืืืื ืืืืื forget password
ืืืืื actionTokens
ืืฉืืฉ ืืืขืงื ืืืจ ืืื ื ืชืื ืื ืฉื ืืกืืืื ืื ืืฉืืืืื - ืืืืืื, ืืกืืืื ืืืจ ืืื ืืฉืืืืฉ ืืื ื ืืชื ืืืคืขืืื ืฉืื. ืกืื ืื ืฉื ืืืืื ืืืจื ืืื ืฆืจืื ืืืืืช ืืฉืืืคื ืืื ืืจืืื ื ืชืื ืื.
ืฉืืืจืช ืืืืื ืืืืืงื ืืช ืฉื ื ืชืื ืื ืืืืืกื ืื ืคืืขื ืืื ืืืงื ืขื ืืขืืืก ืขื ืืกื ืื ืชืื ืื. ืกืื ืื ืฉื ืืืืื ืืฉืคืจ ืืช ืืืืฆืืขืื, ืื ืืืกืืฃ ืืขืื ืืจืืจื. ืื ืฉืจืช Keycloak ืืื ืืขืืื ื ืชืื ืื, ืืฉ ืืืืืข ืืช ืืฉืจืชืื ืืืืจืื ืืื ืฉืืืืื ืืขืืื ืืช ืื ืชืื ืื ืืืืืื ืื ืฉืืื. Keycloak ืืฉืชืืฉ ืืืืืื ืื ืืงืืืืื realms
, users
ะธ authorization
ืืฉืืืจื ืืืืืื ืืืกื ืื ืชืื ืื.
ืืฉ ืื ืืืืื ื ืคืจื work
, ืืฉืจ ืืฉืืืคื ืืื ืืจืืื ืื ืชืื ืื. ืืื ืขืฆืื ืืื ื ืืืืกื ืช ื ืชืื ืื ืืืกื ืื ืชืื ืื, ืืื ืืฉืืฉืช ืืฉืืืืช ืืืืขืืช ืขื ืืืืงื ืืช ืื ืชืื ืื ืืฆืืชืื ืืื ืืจืืื ื ืชืื ืื. ืืืืืื ืืืจืืช, ืืจืืข ืฉืื ืชืื ืื ืืชืขืืื ืื, ืืฆืืืช Keycloak ืฉืืื ืืืืขื ืืฆืืชืื ืืืจืื ืืืจืื ืื ืชืื ืื ืฉืื, ืืื ืื ืืฆืืชืื ืืืจืืื ื ืชืื ืื ืืืจืื. ืืืืจ ืงืืืช ืืืืขื ืืื, ืื ืฆืืืช ืื ืงื ืืช ืื ืชืื ืื ืืืชืืืืื ืืืืืื ืื ืืืงืืืืื ืฉืื.
ืืคืขืืืช ืืฉืชืืฉ. ืืืืื ืื ืขื ืฉืืืช sessions
, clientSessions
, offlineSessions
ะธ offlineClientSessions
, ืืฉืืืคืืื ืืืจื ืืื ืืื ืืจืืื ื ืชืื ืื ืืืฉืืฉืื ืืืืกืื ื ืชืื ืื ืขื ืืคืขืืืช ืฉื ืืฉืชืืฉืื ืคืขืืืื ืืืื ืฉืืืฉืชืืฉ ืคืขืื ืืืคืืคื. ืืืืื ืื ืืื ืขืืืืื ืขื ืืืืฉืื ืืืขืื ืืงืฉืืช HTTP ืืืฉืชืืฉื ืงืฆื, ืื ืฉืื ืืฉืืืืื ืืืคืขืืืช ืืืืงืืช ืืืฉ ืืฉืืคื ืืืชื ืืื ืืจืืื ื ืชืื ืื.
ืืื ื ืขื ืืื ืืก. ืืืืื loginFailures
ืืฉืืฉ ืืืขืงื ืืืจ ื ืชืื ื ืฉืืืืืช ืื ืืกื, ืืืื ืืื ืคืขืืื ืืฉืชืืฉ ืืืื ืกืืกืื ืฉืืืื. ืฉืืคืื ืฉื ืืืืื ืื ืืื ืืืืจืืืช ืืื ืื. ืืื ืืฆืืจื ืืืฉืื ืืืืืง, ืืืื ืืืคืขืื ืฉืืคืื ืืื ืืจืืื ื ืชืื ืื. ืืื ืืฆื ืฉื ื, ืื ืื ืชืฉืืคื ืืช ืื ืชืื ืื ืืืื, ืชืฉืคืจ ืืช ืืืืฆืืขืื, ืืื ืืขืื ืื ืชืชืขืืจืจ, ืืืชืื ืฉืืคืื ืื ืชืืคืขื.
ืืขืช ืืคืขืืช ืืฉืืื Infinispan, ืขืืื ืืืืกืืฃ ืืืืจืืช ืืืืื ืืงืืืฅ ืืืืืจืืช:
<replicated-cache-configuration name="keycloak-sessions" mode="ASYNC" start="EAGER" batching="false">
</replicated-cache-configuration>
<replicated-cache name="work" configuration="keycloak-sessions" />
<replicated-cache name="sessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineSessions" configuration="keycloak-sessions" />
<replicated-cache name="actionTokens" configuration="keycloak-sessions" />
<replicated-cache name="loginFailures" configuration="keycloak-sessions" />
<replicated-cache name="clientSessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineClientSessions" configuration="keycloak-sessions" />
ืขืืื ืืืืืืจ ืืืืคืขืื ืืช ืืฉืืื Infinispan ืืคื ื ืืคืขืืช ืืฉืืื Keycloak
ืื ืืชื ืฆืจืื ืืืืืืจ remoteStore
ืขืืืจ ืืืืื ื Keycloak. ืืฉื ืื, ืืกืคืืง ืกืงืจืืคื, ืฉื ืขืฉื ืืืืื ืืงืืื, ืืืฉืืฉ ืืืืืจืช ืืืฉืชื ื CACHE_OWNERS
, ืืชื ืฆืจืื ืืฉืืืจ ืืืชื ืืงืืืฅ ืืืฉืื ืืืชื ืืกืคืจืืื /opt/jboss/startup-scripts
:
ืชืืื ืืชืกืจืื
embed-server --server-config=standalone-ha.xml --std-out=echo
batch
echo *** Update infinispan subsystem ***
/subsystem=infinispan/cache-container=keycloak:write-attribute(name=module, value=org.keycloak.keycloak-model-infinispan)
echo ** Add remote socket binding to infinispan server **
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-cache:add(host=${remote.cache.host:localhost}, port=${remote.cache.port:11222})
echo ** Update replicated-cache work element **
/subsystem=infinispan/cache-container=keycloak/replicated-cache=work/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=work,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/replicated-cache=work:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache sessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=sessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache offlineSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=offlineSessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache clientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=clientSessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache offlineClientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=offlineClientSessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache loginFailures element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=loginFailures,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache actionTokens element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
cache=actionTokens,
remote-servers=["remote-cache"],
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache authenticationSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=statistics-enabled,value=true)
echo *** Update undertow subsystem ***
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=proxy-address-forwarding,value=true)
run-batch
stop-embedded-server
ืื ืชืฉืื ืืืชืงืื JAVA_OPTS
ืืฆืืชื Keycloak ืืืคืขืื ืืช HotRod: remote.cache.host
, remote.cache.port
ืืฉื ืืฉืืจืืช jboss.site.name
.
ืงืืฉืืจืื ืืชืืขืื ื ืืกืฃ
https://www.keycloak.org/docs/latest/server_installation/index.html https://docs.wildfly.org/17/High_Availability_Guide.html#cluster-configuration https://infinispan.org/docs/9.4.x/user_guide/user_guide.html https://hub.docker.com/r/jboss/keycloak https://hub.docker.com/r/jboss/infinispan
ืืืืืจ ืชืืจืื ืืืืื ืืืืจ ืขื ืืื ืขืืืืื
ืืงืืจ: www.habr.com