Added ClientSessionModel to UserSessionProvider
This commit is contained in:
1 parent
7f4849e165
commit
02a59812e6
41 files changed
+1529
-694
No files matched your search
+79
@@ -0,0 +1,79 @@
|
||||
package org.keycloak.models.sessions.mem;
|
||||
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.ClientSessionModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.UserSessionModel;
|
||||
import org.keycloak.models.sessions.mem.entities.ClientSessionEntity;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
|
||||
*/
|
||||
public class ClientSessionAdapter implements ClientSessionModel {
|
||||
|
||||
private KeycloakSession session;
|
||||
private MemUserSessionProvider provider;
|
||||
private RealmModel realm;
|
||||
private ClientSessionEntity entity;
|
||||
|
||||
public ClientSessionAdapter(KeycloakSession session, MemUserSessionProvider provider, RealmModel realm, ClientSessionEntity entity) {
|
||||
this.session = session;
|
||||
this.provider = provider;
|
||||
this.realm = realm;
|
||||
this.entity = entity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return entity.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientModel getClient() {
|
||||
return realm.findClientById(entity.getClientId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getState() {
|
||||
return entity.getState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserSessionModel getUserSession() {
|
||||
return new UserSessionAdapter(session, provider, realm, entity.getSession());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRedirectUri() {
|
||||
return entity.getRedirectUri();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTimestamp() {
|
||||
return entity.getTimestamp();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTimestamp(int timestamp) {
|
||||
entity.setTimestamp(timestamp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionModel.Action getAction() {
|
||||
return entity.getAction();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAction(ClientSessionModel.Action action) {
|
||||
entity.setAction(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getRoles() {
|
||||
return entity.getRoles();
|
||||
}
|
||||
|
||||
}
|
||||
+87
-38
@@ -1,14 +1,15 @@
|
||||
package org.keycloak.models.sessions.mem;
|
||||
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.ClientSessionModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.UserModel;
|
||||
import org.keycloak.models.UserSessionModel;
|
||||
import org.keycloak.models.UserSessionProvider;
|
||||
import org.keycloak.models.UsernameLoginFailureModel;
|
||||
import org.keycloak.models.sessions.mem.entities.ClientSessionEntity;
|
||||
import org.keycloak.models.sessions.mem.entities.UserSessionEntity;
|
||||
import org.keycloak.models.sessions.mem.entities.UserSessionKey;
|
||||
import org.keycloak.models.sessions.mem.entities.UsernameLoginFailureEntity;
|
||||
import org.keycloak.models.sessions.mem.entities.UsernameLoginFailureKey;
|
||||
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||
@@ -19,6 +20,7 @@ import java.util.Comparator;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
@@ -27,15 +29,42 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
public class MemUserSessionProvider implements UserSessionProvider {
|
||||
|
||||
private final KeycloakSession session;
|
||||
private final ConcurrentHashMap<UserSessionKey, UserSessionEntity> sessions;
|
||||
private final ConcurrentHashMap<String, UserSessionEntity> userSessions;
|
||||
private final ConcurrentHashMap<String, ClientSessionEntity> clientSessions;
|
||||
private final ConcurrentHashMap<UsernameLoginFailureKey, UsernameLoginFailureEntity> loginFailures;
|
||||
|
||||
public MemUserSessionProvider(KeycloakSession session, ConcurrentHashMap<UserSessionKey, UserSessionEntity> sessions, ConcurrentHashMap<UsernameLoginFailureKey, UsernameLoginFailureEntity> loginFailures) {
|
||||
public MemUserSessionProvider(KeycloakSession session, ConcurrentHashMap<String, UserSessionEntity> userSessions, ConcurrentHashMap<String, ClientSessionEntity> clientSessions, ConcurrentHashMap<UsernameLoginFailureKey, UsernameLoginFailureEntity> loginFailures) {
|
||||
this.session = session;
|
||||
this.sessions = sessions;
|
||||
this.userSessions = userSessions;
|
||||
this.clientSessions = clientSessions;
|
||||
this.loginFailures = loginFailures;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionModel createClientSession(RealmModel realm, ClientModel client, UserSessionModel userSession, String redirectUri, String state, Set<String> roles) {
|
||||
UserSessionEntity userSessionEntity = getUserSessionEntity(realm, userSession.getId());
|
||||
|
||||
ClientSessionEntity entity = new ClientSessionEntity();
|
||||
entity.setId(KeycloakModelUtils.generateId());
|
||||
entity.setTimestamp(Time.currentTime());
|
||||
entity.setClientId(client.getId());
|
||||
entity.setSession(userSessionEntity);
|
||||
entity.setRedirectUri(redirectUri);
|
||||
entity.setState(state);
|
||||
entity.setRoles(roles);
|
||||
|
||||
userSessionEntity.addClientSession(entity);
|
||||
|
||||
clientSessions.put(entity.getId(), entity);
|
||||
return new ClientSessionAdapter(session, this, realm, entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientSessionModel getClientSession(RealmModel realm, String id) {
|
||||
ClientSessionEntity entity = clientSessions.get(id);
|
||||
return entity != null ? new ClientSessionAdapter(session, this, realm, entity) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserSessionModel createUserSession(RealmModel realm, UserModel user, String loginUsername, String ipAddress, String authMethod, boolean rememberMe) {
|
||||
String id = KeycloakModelUtils.generateId();
|
||||
@@ -54,23 +83,31 @@ public class MemUserSessionProvider implements UserSessionProvider {
|
||||
entity.setStarted(currentTime);
|
||||
entity.setLastSessionRefresh(currentTime);
|
||||
|
||||
sessions.put(new UserSessionKey(realm.getId(), id), entity);
|
||||
userSessions.put(id, entity);
|
||||
|
||||
return new UserSessionAdapter(session, realm, entity);
|
||||
return new UserSessionAdapter(session, this, realm, entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserSessionModel getUserSession(RealmModel realm, String id) {
|
||||
UserSessionEntity entity = sessions.get(new UserSessionKey(realm.getId(), id));
|
||||
return entity != null ? new UserSessionAdapter(session, realm, entity) : null;
|
||||
UserSessionEntity entity = getUserSessionEntity(realm, id);
|
||||
return entity != null ? new UserSessionAdapter(session, this, realm, entity) : null;
|
||||
}
|
||||
|
||||
UserSessionEntity getUserSessionEntity(RealmModel realm, String id) {
|
||||
UserSessionEntity entity = userSessions.get(id);
|
||||
if (entity != null && entity.getRealm().equals(realm.getId())) {
|
||||
return entity;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserSessionModel> getUserSessions(RealmModel realm, UserModel user) {
|
||||
List<UserSessionModel> userSessions = new LinkedList<UserSessionModel>();
|
||||
for (UserSessionEntity s : sessions.values()) {
|
||||
for (UserSessionEntity s : this.userSessions.values()) {
|
||||
if (s.getRealm().equals(realm.getId()) && s.getUser().equals(user.getId())) {
|
||||
userSessions.add(new UserSessionAdapter(session, realm, s));
|
||||
userSessions.add(new UserSessionAdapter(session, this, realm, s));
|
||||
}
|
||||
}
|
||||
return userSessions;
|
||||
@@ -78,14 +115,21 @@ public class MemUserSessionProvider implements UserSessionProvider {
|
||||
|
||||
@Override
|
||||
public List<UserSessionModel> getUserSessions(RealmModel realm, ClientModel client) {
|
||||
List<UserSessionModel> clientSessions = new LinkedList<UserSessionModel>();
|
||||
for (UserSessionEntity s : sessions.values()) {
|
||||
if (s.getRealm().equals(realm.getId()) && s.getClients().contains(client.getClientId())) {
|
||||
clientSessions.add(new UserSessionAdapter(session, realm, s));
|
||||
List<UserSessionEntity> userSessionEntities = new LinkedList<UserSessionEntity>();
|
||||
for (ClientSessionEntity s : clientSessions.values()) {
|
||||
if (s.getSession().getRealm().equals(realm.getId()) && s.getClientId().equals(client.getId())) {
|
||||
if (!userSessionEntities.contains(s.getSession())) {
|
||||
userSessionEntities.add(s.getSession());
|
||||
}
|
||||
}
|
||||
}
|
||||
Collections.sort(clientSessions, new UserSessionSort());
|
||||
return clientSessions;
|
||||
|
||||
List<UserSessionModel> userSessions = new LinkedList<UserSessionModel>();
|
||||
for (UserSessionEntity e : userSessionEntities) {
|
||||
userSessions.add(new UserSessionAdapter(session, this, realm, e));
|
||||
}
|
||||
Collections.sort(userSessions, new UserSessionSort());
|
||||
return userSessions;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -101,49 +145,61 @@ public class MemUserSessionProvider implements UserSessionProvider {
|
||||
|
||||
@Override
|
||||
public int getActiveUserSessions(RealmModel realm, ClientModel client) {
|
||||
int count = 0;
|
||||
for (UserSessionEntity s : sessions.values()) {
|
||||
if (s.getRealm().equals(realm.getId()) && s.getClients().contains(client.getClientId())) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
return getUserSessions(realm, client).size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUserSession(RealmModel realm, UserSessionModel session) {
|
||||
sessions.remove(new UserSessionKey(realm.getId(), session.getId()));
|
||||
UserSessionEntity entity = getUserSessionEntity(realm, session.getId());
|
||||
if (entity != null) {
|
||||
userSessions.remove(entity.getId());
|
||||
for (ClientSessionEntity clientSession : entity.getClientSessions()) {
|
||||
clientSessions.remove(clientSession.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUserSessions(RealmModel realm, UserModel user) {
|
||||
Iterator<UserSessionEntity> itr = sessions.values().iterator();
|
||||
Iterator<UserSessionEntity> itr = userSessions.values().iterator();
|
||||
while (itr.hasNext()) {
|
||||
UserSessionEntity s = itr.next();
|
||||
if (s.getRealm().equals(realm.getId()) && s.getUser().equals(user.getId())) {
|
||||
itr.remove();
|
||||
|
||||
for (ClientSessionEntity clientSession : s.getClientSessions()) {
|
||||
clientSessions.remove(clientSession.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeExpiredUserSessions(RealmModel realm) {
|
||||
Iterator<UserSessionEntity> itr = sessions.values().iterator();
|
||||
Iterator<UserSessionEntity> itr = userSessions.values().iterator();
|
||||
while (itr.hasNext()) {
|
||||
UserSessionEntity s = itr.next();
|
||||
if (s.getRealm().equals(realm.getId()) && (s.getLastSessionRefresh() < Time.currentTime() - realm.getSsoSessionIdleTimeout() || s.getStarted() < Time.currentTime() - realm.getSsoSessionMaxLifespan())) {
|
||||
itr.remove();
|
||||
|
||||
for (ClientSessionEntity clientSession : s.getClientSessions()) {
|
||||
clientSessions.remove(clientSession.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUserSessions(RealmModel realm) {
|
||||
Iterator<UserSessionEntity> itr = sessions.values().iterator();
|
||||
Iterator<UserSessionEntity> itr = userSessions.values().iterator();
|
||||
while (itr.hasNext()) {
|
||||
UserSessionEntity s = itr.next();
|
||||
if (s.getRealm().equals(realm.getId())) {
|
||||
itr.remove();
|
||||
|
||||
for (ClientSessionEntity clientSession : s.getClientSessions()) {
|
||||
clientSessions.remove(clientSession.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -185,17 +241,10 @@ public class MemUserSessionProvider implements UserSessionProvider {
|
||||
|
||||
@Override
|
||||
public void onClientRemoved(RealmModel realm, ClientModel client) {
|
||||
Iterator<UserSessionEntity> itr = sessions.values().iterator();
|
||||
while (itr.hasNext()) {
|
||||
UserSessionEntity s = itr.next();
|
||||
if (s.getRealm().equals(realm.getId())) {
|
||||
itr.remove();
|
||||
}
|
||||
}
|
||||
|
||||
for (UserSessionEntity s : sessions.values()) {
|
||||
if (s.getRealm().equals(realm.getId())) {
|
||||
s.getClients().remove(client.getClientId());
|
||||
for (ClientSessionEntity e : clientSessions.values()) {
|
||||
if (e.getSession().getRealm().equals(realm.getId()) && e.getClientId().equals(client.getId())) {
|
||||
clientSessions.remove(e.getId());
|
||||
e.getSession().removeClientSession(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-4
@@ -4,8 +4,8 @@ import org.keycloak.Config;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.UserSessionProvider;
|
||||
import org.keycloak.models.UserSessionProviderFactory;
|
||||
import org.keycloak.models.sessions.mem.entities.ClientSessionEntity;
|
||||
import org.keycloak.models.sessions.mem.entities.UserSessionEntity;
|
||||
import org.keycloak.models.sessions.mem.entities.UserSessionKey;
|
||||
import org.keycloak.models.sessions.mem.entities.UsernameLoginFailureEntity;
|
||||
import org.keycloak.models.sessions.mem.entities.UsernameLoginFailureKey;
|
||||
|
||||
@@ -18,13 +18,15 @@ public class MemUserSessionProviderFactory implements UserSessionProviderFactory
|
||||
|
||||
public static final String ID = "mem";
|
||||
|
||||
private ConcurrentHashMap<UserSessionKey, UserSessionEntity> sessions = new ConcurrentHashMap<UserSessionKey, UserSessionEntity>();
|
||||
private ConcurrentHashMap<String, UserSessionEntity> userSessions = new ConcurrentHashMap<String, UserSessionEntity>();
|
||||
|
||||
private ConcurrentHashMap<String, ClientSessionEntity> clientSessions = new ConcurrentHashMap<String, ClientSessionEntity>();
|
||||
|
||||
private ConcurrentHashMap<UsernameLoginFailureKey, UsernameLoginFailureEntity> loginFailures = new ConcurrentHashMap<UsernameLoginFailureKey, UsernameLoginFailureEntity>();
|
||||
|
||||
@Override
|
||||
public UserSessionProvider create(KeycloakSession session) {
|
||||
return new MemUserSessionProvider(session, sessions, loginFailures);
|
||||
return new MemUserSessionProvider(session, userSessions, clientSessions, loginFailures);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -33,7 +35,7 @@ public class MemUserSessionProviderFactory implements UserSessionProviderFactory
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
sessions.clear();
|
||||
userSessions.clear();
|
||||
loginFailures.clear();
|
||||
}
|
||||
|
||||
|
||||
+12
-18
@@ -1,10 +1,12 @@
|
||||
package org.keycloak.models.sessions.mem;
|
||||
|
||||
import org.keycloak.models.ClientModel;
|
||||
import org.keycloak.models.ClientSessionModel;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.models.UserModel;
|
||||
import org.keycloak.models.UserSessionModel;
|
||||
import org.keycloak.models.sessions.mem.entities.ClientSessionEntity;
|
||||
import org.keycloak.models.sessions.mem.entities.UserSessionEntity;
|
||||
|
||||
import java.util.LinkedList;
|
||||
@@ -17,12 +19,14 @@ public class UserSessionAdapter implements UserSessionModel {
|
||||
|
||||
private final KeycloakSession session;
|
||||
|
||||
private MemUserSessionProvider provider;
|
||||
private final RealmModel realm;
|
||||
|
||||
private final UserSessionEntity entity;
|
||||
|
||||
public UserSessionAdapter(KeycloakSession session, RealmModel realm, UserSessionEntity entity) {
|
||||
public UserSessionAdapter(KeycloakSession session, MemUserSessionProvider provider, RealmModel realm, UserSessionEntity entity) {
|
||||
this.session = session;
|
||||
this.provider = provider;
|
||||
this.realm = realm;
|
||||
this.entity = entity;
|
||||
}
|
||||
@@ -98,24 +102,14 @@ public class UserSessionAdapter implements UserSessionModel {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void associateClient(ClientModel client) {
|
||||
if (!entity.getClients().contains(client.getClientId())) {
|
||||
entity.getClients().add(client.getClientId());
|
||||
public List<ClientSessionModel> getClientSessions() {
|
||||
List<ClientSessionModel> clientSessionModels = new LinkedList<ClientSessionModel>();
|
||||
if (entity.getClientSessions() != null) {
|
||||
for (ClientSessionEntity e : entity.getClientSessions()) {
|
||||
clientSessionModels.add(new ClientSessionAdapter(session, provider, realm, e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ClientModel> getClientAssociations() {
|
||||
List<ClientModel> models = new LinkedList<ClientModel>();
|
||||
for (String clientId : entity.getClients()) {
|
||||
models.add(realm.findClient(clientId));
|
||||
}
|
||||
return models;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAssociatedClient(ClientModel client) {
|
||||
entity.getClients().remove(client.getClientId());
|
||||
return clientSessionModels;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
package org.keycloak.models.sessions.mem.entities;
|
||||
|
||||
import org.keycloak.models.ClientSessionModel;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
|
||||
*/
|
||||
public class ClientSessionEntity {
|
||||
|
||||
private String id;
|
||||
private String clientId;
|
||||
|
||||
private UserSessionEntity session;
|
||||
|
||||
private String redirectUri;
|
||||
private String state;
|
||||
|
||||
private int timestamp;
|
||||
private ClientSessionModel.Action action;
|
||||
private Set<String> roles;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getClientId() {
|
||||
return clientId;
|
||||
}
|
||||
|
||||
public void setClientId(String clientId) {
|
||||
this.clientId = clientId;
|
||||
}
|
||||
|
||||
public UserSessionEntity getSession() {
|
||||
return session;
|
||||
}
|
||||
|
||||
public void setSession(UserSessionEntity session) {
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
public String getRedirectUri() {
|
||||
return redirectUri;
|
||||
}
|
||||
|
||||
public void setRedirectUri(String redirectUri) {
|
||||
this.redirectUri = redirectUri;
|
||||
}
|
||||
|
||||
public String getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setState(String state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public int getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
public void setTimestamp(int timestamp) {
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
public ClientSessionModel.Action getAction() {
|
||||
return action;
|
||||
}
|
||||
|
||||
public void setAction(ClientSessionModel.Action action) {
|
||||
this.action = action;
|
||||
}
|
||||
|
||||
public Set<String> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
public void setRoles(Set<String> roles) {
|
||||
this.roles = roles;
|
||||
}
|
||||
}
|
||||
+15
-5
@@ -1,5 +1,6 @@
|
||||
package org.keycloak.models.sessions.mem.entities;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -17,7 +18,7 @@ public class UserSessionEntity {
|
||||
private boolean rememberMe;
|
||||
private int started;
|
||||
private int lastSessionRefresh;
|
||||
private List<String> clients = new LinkedList<String>();
|
||||
private List<ClientSessionEntity> clientSessions = Collections.synchronizedList(new LinkedList<ClientSessionEntity>());
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
@@ -91,12 +92,21 @@ public class UserSessionEntity {
|
||||
this.lastSessionRefresh = lastSessionRefresh;
|
||||
}
|
||||
|
||||
public List<String> getClients() {
|
||||
return clients;
|
||||
public void addClientSession(ClientSessionEntity clientSession) {
|
||||
if (clientSessions == null) {
|
||||
clientSessions = new LinkedList<ClientSessionEntity>();
|
||||
}
|
||||
clientSessions.add(clientSession);
|
||||
}
|
||||
|
||||
public void setClients(List<String> clients) {
|
||||
this.clients = clients;
|
||||
public void removeClientSession(ClientSessionEntity clientSession) {
|
||||
if (clientSessions != null) {
|
||||
clientSessions.remove(clientSession);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ClientSessionEntity> getClientSessions() {
|
||||
return clientSessions;
|
||||
}
|
||||
|
||||
}
|
||||
-36
@@ -1,36 +0,0 @@
|
||||
package org.keycloak.models.sessions.mem.entities;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
|
||||
*/
|
||||
public class UserSessionKey {
|
||||
|
||||
private final String realm;
|
||||
private final String id;
|
||||
|
||||
public UserSessionKey(String realm, String id) {
|
||||
this.realm = realm;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
UserSessionKey key = (UserSessionKey) o;
|
||||
|
||||
if (realm != null ? !realm.equals(key.realm) : key.realm != null) return false;
|
||||
if (id != null ? !id.equals(key.id) : key.id != null) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = realm != null ? realm.hashCode() : 0;
|
||||
result = 31 * result + (id != null ? id.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user