KEYCLOAK-8379 Migrate ModelClass: AuthenticationSessionProviderTest
This commit is contained in:
parent
93965512c5
commit
d0b7700c04
2 changed files with 398 additions and 299 deletions
|
@ -0,0 +1,398 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.keycloak.testsuite.model;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.container.test.api.Deployment;
|
||||||
|
import org.jboss.arquillian.container.test.api.TargetsContainer;
|
||||||
|
import org.jboss.shrinkwrap.api.spec.WebArchive;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.admin.client.resource.UserResource;
|
||||||
|
import org.keycloak.common.util.Time;
|
||||||
|
import org.keycloak.models.*;
|
||||||
|
import org.keycloak.models.utils.KeycloakModelUtils;
|
||||||
|
import org.keycloak.representations.idm.RealmRepresentation;
|
||||||
|
import org.keycloak.services.managers.ClientManager;
|
||||||
|
import org.keycloak.services.managers.RealmManager;
|
||||||
|
import org.keycloak.sessions.AuthenticationSessionModel;
|
||||||
|
import org.keycloak.sessions.CommonClientSessionModel;
|
||||||
|
import org.keycloak.sessions.RootAuthenticationSessionModel;
|
||||||
|
import org.keycloak.testsuite.AbstractTestRealmKeycloakTest;
|
||||||
|
import org.keycloak.testsuite.arquillian.annotation.ModelTest;
|
||||||
|
import org.keycloak.testsuite.runonserver.RunOnServerDeployment;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import static org.hamcrest.core.Is.is;
|
||||||
|
import static org.hamcrest.core.IsNull.notNullValue;
|
||||||
|
import static org.hamcrest.core.IsNull.nullValue;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.keycloak.testsuite.arquillian.DeploymentTargetModifier.AUTH_SERVER_CURRENT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
|
||||||
|
*/
|
||||||
|
public class AuthenticationSessionProviderTest extends AbstractTestRealmKeycloakTest {
|
||||||
|
|
||||||
|
@Deployment
|
||||||
|
@TargetsContainer(AUTH_SERVER_CURRENT)
|
||||||
|
public static WebArchive deploy() {
|
||||||
|
return RunOnServerDeployment.create(UserResource.class, AuthenticationSessionProviderTest.class)
|
||||||
|
.addPackages(true,
|
||||||
|
"org.keycloak.testsuite",
|
||||||
|
"org.keycloak.testsuite.model");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
testingClient.server().run(session -> {
|
||||||
|
RealmModel realm = session.realms().getRealm("test");
|
||||||
|
session.users().addUser(realm, "user1").setEmail("user1@localhost");
|
||||||
|
session.users().addUser(realm, "user2").setEmail("user2@localhost");
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after() {
|
||||||
|
testingClient.server().run(session -> {
|
||||||
|
RealmModel realm = session.realms().getRealm("test");
|
||||||
|
session.sessions().removeUserSessions(realm);
|
||||||
|
|
||||||
|
UserModel user1 = session.users().getUserByUsername("user1", realm);
|
||||||
|
UserModel user2 = session.users().getUserByUsername("user2", realm);
|
||||||
|
|
||||||
|
UserManager um = new UserManager(session);
|
||||||
|
if (user1 != null) {
|
||||||
|
um.removeUser(realm, user1);
|
||||||
|
}
|
||||||
|
if (user2 != null) {
|
||||||
|
um.removeUser(realm, user2);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@ModelTest
|
||||||
|
public void testLoginSessionsCRUD(KeycloakSession session) {
|
||||||
|
AtomicReference<String> rootAuthSessionID = new AtomicReference<>();
|
||||||
|
AtomicReference<String> tabID = new AtomicReference<>();
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionCRUD1) -> {
|
||||||
|
KeycloakSession currentSession = sessionCRUD1;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
ClientModel client1 = realm.getClientByClientId("test-app");
|
||||||
|
|
||||||
|
RootAuthenticationSessionModel rootAuthSession = currentSession.authenticationSessions().createRootAuthenticationSession(realm);
|
||||||
|
rootAuthSessionID.set(rootAuthSession.getId());
|
||||||
|
|
||||||
|
AuthenticationSessionModel authSession = rootAuthSession.createAuthenticationSession(client1);
|
||||||
|
tabID.set(authSession.getTabId());
|
||||||
|
|
||||||
|
authSession.setAction("foo");
|
||||||
|
rootAuthSession.setTimestamp(100);
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionCRUD2) -> {
|
||||||
|
KeycloakSession currentSession = sessionCRUD2;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
ClientModel client1 = realm.getClientByClientId("test-app");
|
||||||
|
|
||||||
|
// Ensure currentSession is here
|
||||||
|
RootAuthenticationSessionModel rootAuthSession = currentSession.authenticationSessions().getRootAuthenticationSession(realm, rootAuthSessionID.get());
|
||||||
|
AuthenticationSessionModel authSession = rootAuthSession.getAuthenticationSession(client1, tabID.get());
|
||||||
|
testAuthenticationSession(authSession, client1.getId(), null, "foo");
|
||||||
|
|
||||||
|
assertThat(rootAuthSession.getTimestamp(), is(100));
|
||||||
|
|
||||||
|
// Update and commit
|
||||||
|
authSession.setAction("foo-updated");
|
||||||
|
rootAuthSession.setTimestamp(200);
|
||||||
|
authSession.setAuthenticatedUser(currentSession.users().getUserByUsername("user1", realm));
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionCRUD3) -> {
|
||||||
|
KeycloakSession currentSession = sessionCRUD3;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
UserModel user1 = currentSession.users().getUserByUsername("user1", realm);
|
||||||
|
|
||||||
|
// Ensure currentSession was updated
|
||||||
|
RootAuthenticationSessionModel rootAuthSession = currentSession.authenticationSessions().getRootAuthenticationSession(realm, rootAuthSessionID.get());
|
||||||
|
ClientModel client1 = realm.getClientByClientId("test-app");
|
||||||
|
AuthenticationSessionModel authSession = rootAuthSession.getAuthenticationSession(client1, tabID.get());
|
||||||
|
|
||||||
|
testAuthenticationSession(authSession, client1.getId(), user1.getId(), "foo-updated");
|
||||||
|
|
||||||
|
assertThat(rootAuthSession.getTimestamp(), is(200));
|
||||||
|
|
||||||
|
// Remove and commit
|
||||||
|
currentSession.authenticationSessions().removeRootAuthenticationSession(realm, rootAuthSession);
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionCRUD4) -> {
|
||||||
|
KeycloakSession currentSession = sessionCRUD4;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
// Ensure currentSession was removed
|
||||||
|
assertThat(currentSession.authenticationSessions().getRootAuthenticationSession(realm, rootAuthSessionID.get()), nullValue());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@ModelTest
|
||||||
|
public void testAuthenticationSessionRestart(KeycloakSession session) {
|
||||||
|
AtomicReference<String> parentAuthSessionID = new AtomicReference<>();
|
||||||
|
AtomicReference<String> tabID = new AtomicReference<>();
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionRestart1) -> {
|
||||||
|
KeycloakSession currentSession = sessionRestart1;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
ClientModel client1 = realm.getClientByClientId("test-app");
|
||||||
|
UserModel user1 = currentSession.users().getUserByUsername("user1", realm);
|
||||||
|
|
||||||
|
AuthenticationSessionModel authSession = currentSession.authenticationSessions().createRootAuthenticationSession(realm)
|
||||||
|
.createAuthenticationSession(client1);
|
||||||
|
|
||||||
|
parentAuthSessionID.set(authSession.getParentSession().getId());
|
||||||
|
tabID.set(authSession.getTabId());
|
||||||
|
|
||||||
|
authSession.setAction("foo");
|
||||||
|
authSession.getParentSession().setTimestamp(100);
|
||||||
|
|
||||||
|
authSession.setAuthenticatedUser(user1);
|
||||||
|
authSession.setAuthNote("foo", "bar");
|
||||||
|
authSession.setClientNote("foo2", "bar2");
|
||||||
|
authSession.setExecutionStatus("123", CommonClientSessionModel.ExecutionStatus.SUCCESS);
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionRestart2) -> {
|
||||||
|
KeycloakSession currentSession = sessionRestart2;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
// Test restart root authentication session
|
||||||
|
ClientModel client1 = realm.getClientByClientId("test-app");
|
||||||
|
AuthenticationSessionModel authSession = currentSession.authenticationSessions().getRootAuthenticationSession(realm, parentAuthSessionID.get())
|
||||||
|
.getAuthenticationSession(client1, tabID.get());
|
||||||
|
authSession.getParentSession().restartSession(realm);
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionRestart3) -> {
|
||||||
|
KeycloakSession currentSession = sessionRestart3;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
ClientModel client1 = realm.getClientByClientId("test-app");
|
||||||
|
|
||||||
|
RootAuthenticationSessionModel rootAuthSession = currentSession.authenticationSessions().getRootAuthenticationSession(realm, parentAuthSessionID.get());
|
||||||
|
|
||||||
|
assertThat(rootAuthSession.getAuthenticationSession(client1, tabID.get()), nullValue());
|
||||||
|
assertThat(rootAuthSession.getTimestamp() > 0, is(true));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@ModelTest
|
||||||
|
public void testExpiredAuthSessions(KeycloakSession session) {
|
||||||
|
AtomicReference<String> authSessionID = new AtomicReference<>();
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionExpired) -> {
|
||||||
|
KeycloakSession mainSession = sessionExpired;
|
||||||
|
try {
|
||||||
|
// AccessCodeLifespan = 10 ; AccessCodeLifespanUserAction = 10 ; AccessCodeLifespanLogin = 30
|
||||||
|
setAccessCodeLifespan(mainSession, 10, 10, 30);
|
||||||
|
|
||||||
|
createAuthSession(mainSession, authSessionID);
|
||||||
|
testExpiredOffset(mainSession, 25, false, authSessionID.get());
|
||||||
|
testExpiredOffset(mainSession, 35, true, authSessionID.get());
|
||||||
|
|
||||||
|
// AccessCodeLifespan = Not set ; AccessCodeLifespanUserAction = 10 ; AccessCodeLifespanLogin = Not set
|
||||||
|
setAccessCodeLifespan(mainSession, -1, 40, -1);
|
||||||
|
|
||||||
|
createAuthSession(mainSession, authSessionID);
|
||||||
|
testExpiredOffset(mainSession, 35, false, authSessionID.get());
|
||||||
|
testExpiredOffset(mainSession, 45, true, authSessionID.get());
|
||||||
|
|
||||||
|
// AccessCodeLifespan = 50 ; AccessCodeLifespanUserAction = Not set ; AccessCodeLifespanLogin = Not set
|
||||||
|
setAccessCodeLifespan(mainSession, 50, -1, -1);
|
||||||
|
|
||||||
|
createAuthSession(mainSession, authSessionID);
|
||||||
|
testExpiredOffset(mainSession, 45, false, authSessionID.get());
|
||||||
|
testExpiredOffset(mainSession, 55, true, authSessionID.get());
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
Time.setOffset(0);
|
||||||
|
setAccessCodeLifespan(mainSession, 60, 300, 1800);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@ModelTest
|
||||||
|
public void testOnRealmRemoved(KeycloakSession session) {
|
||||||
|
AtomicReference<String> authSessionID = new AtomicReference<>();
|
||||||
|
AtomicReference<String> authSessionID2 = new AtomicReference<>();
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sesRealmRemoved1) -> {
|
||||||
|
KeycloakSession currentSession = sesRealmRemoved1;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
RealmModel fooRealm = currentSession.realms().createRealm("foo-realm");
|
||||||
|
|
||||||
|
fooRealm.addClient("foo-client");
|
||||||
|
|
||||||
|
authSessionID.set(currentSession.authenticationSessions().createRootAuthenticationSession(realm).getId());
|
||||||
|
authSessionID2.set(currentSession.authenticationSessions().createRootAuthenticationSession(fooRealm).getId());
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sesRealmRemoved2) -> {
|
||||||
|
KeycloakSession currentSession = sesRealmRemoved2;
|
||||||
|
|
||||||
|
new RealmManager(currentSession).removeRealm(currentSession.realms().getRealmByName("foo-realm"));
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sesRealmRemoved3) -> {
|
||||||
|
KeycloakSession currentSession = sesRealmRemoved3;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
RootAuthenticationSessionModel authSession = currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID.get());
|
||||||
|
|
||||||
|
assertThat(authSession, notNullValue());
|
||||||
|
assertThat(currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID2.get()), nullValue());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@ModelTest
|
||||||
|
public void testOnClientRemoved(KeycloakSession session) {
|
||||||
|
AtomicReference<String> tab1ID = new AtomicReference<>();
|
||||||
|
AtomicReference<String> tab2ID = new AtomicReference<>();
|
||||||
|
AtomicReference<String> authSessionID = new AtomicReference<>();
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sesRealmRemoved1) -> {
|
||||||
|
KeycloakSession currentSession = sesRealmRemoved1;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
authSessionID.set(currentSession.authenticationSessions().createRootAuthenticationSession(realm).getId());
|
||||||
|
|
||||||
|
AuthenticationSessionModel authSession1 = currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID.get()).createAuthenticationSession(realm.getClientByClientId("test-app"));
|
||||||
|
AuthenticationSessionModel authSession2 = currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID.get()).createAuthenticationSession(realm.getClientByClientId("third-party"));
|
||||||
|
tab1ID.set(authSession1.getTabId());
|
||||||
|
tab2ID.set(authSession2.getTabId());
|
||||||
|
|
||||||
|
authSession1.setAuthNote("foo", "bar");
|
||||||
|
authSession2.setAuthNote("foo", "baz");
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sesRealmRemoved1) -> {
|
||||||
|
KeycloakSession currentSession = sesRealmRemoved1;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
RootAuthenticationSessionModel rootAuthSession = currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID.get());
|
||||||
|
|
||||||
|
assertThat(rootAuthSession.getAuthenticationSessions().size(), is(2));
|
||||||
|
assertThat(rootAuthSession.getAuthenticationSession(realm.getClientByClientId("test-app"), tab1ID.get()).getAuthNote("foo"), is("bar"));
|
||||||
|
assertThat(rootAuthSession.getAuthenticationSession(realm.getClientByClientId("third-party"), tab2ID.get()).getAuthNote("foo"), is("baz"));
|
||||||
|
|
||||||
|
new ClientManager(new RealmManager(currentSession)).removeClient(realm, realm.getClientByClientId("third-party"));
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sesRealmRemoved1) -> {
|
||||||
|
KeycloakSession currentSession = sesRealmRemoved1;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
RootAuthenticationSessionModel rootAuthSession = currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID.get());
|
||||||
|
|
||||||
|
assertThat(rootAuthSession.getAuthenticationSession(realm.getClientByClientId("test-app"), tab1ID.get()).getAuthNote("foo"), is("bar"));
|
||||||
|
assertThat(rootAuthSession.getAuthenticationSession(realm.getClientByClientId("third-party"), tab2ID.get()), nullValue());
|
||||||
|
|
||||||
|
// Revert client
|
||||||
|
realm.addClient("third-party");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testAuthenticationSession(AuthenticationSessionModel authSession, String expectedClientId, String expectedUserId, String expectedAction) {
|
||||||
|
assertThat(authSession.getClient().getId(), is(expectedClientId));
|
||||||
|
|
||||||
|
if (expectedUserId == null) {
|
||||||
|
assertThat(authSession.getAuthenticatedUser(), nullValue());
|
||||||
|
} else {
|
||||||
|
assertThat(authSession.getAuthenticatedUser().getId(), is(expectedUserId));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expectedAction == null) {
|
||||||
|
assertThat(authSession.getAction(), nullValue());
|
||||||
|
} else {
|
||||||
|
assertThat(authSession.getAction(), is(expectedAction));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createAuthSession(KeycloakSession session, AtomicReference<String> authSessionID) {
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession createAuthSession) -> {
|
||||||
|
KeycloakSession currentSession = createAuthSession;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
Time.setOffset(0);
|
||||||
|
authSessionID.set(currentSession.authenticationSessions().createRootAuthenticationSession(realm).getId());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testExpiredOffset(KeycloakSession session, int offset, boolean isSessionNull, String authSessionID) {
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionExp) -> {
|
||||||
|
KeycloakSession currentSession = sessionExp;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
Time.setOffset(offset);
|
||||||
|
currentSession.authenticationSessions().removeExpired(realm);
|
||||||
|
});
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionExpVerify) -> {
|
||||||
|
KeycloakSession currentSession = sessionExpVerify;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
if (isSessionNull)
|
||||||
|
assertThat(currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID), nullValue());
|
||||||
|
else
|
||||||
|
assertThat(currentSession.authenticationSessions().getRootAuthenticationSession(realm, authSessionID), notNullValue());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// If parameter is -1, then the parameter won't change.
|
||||||
|
private void setAccessCodeLifespan(KeycloakSession session, int lifespan, int lifespanUserAction, int lifespanLogin) {
|
||||||
|
|
||||||
|
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), (KeycloakSession sessionLifespan) -> {
|
||||||
|
KeycloakSession currentSession = sessionLifespan;
|
||||||
|
RealmModel realm = currentSession.realms().getRealm("test");
|
||||||
|
|
||||||
|
if (lifespan != -1)
|
||||||
|
realm.setAccessCodeLifespan(lifespan);
|
||||||
|
|
||||||
|
if (lifespanUserAction != -1)
|
||||||
|
realm.setAccessCodeLifespanUserAction(lifespanUserAction);
|
||||||
|
|
||||||
|
if (lifespanLogin != -1)
|
||||||
|
realm.setAccessCodeLifespanLogin(lifespanLogin);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configureTestRealm(RealmRepresentation testRealm) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,299 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
|
||||||
* and other contributors as indicated by the @author tags.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.keycloak.testsuite.model;
|
|
||||||
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.ClassRule;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.keycloak.common.util.Time;
|
|
||||||
import org.keycloak.models.ClientModel;
|
|
||||||
import org.keycloak.models.KeycloakSession;
|
|
||||||
import org.keycloak.models.RealmModel;
|
|
||||||
import org.keycloak.models.UserManager;
|
|
||||||
import org.keycloak.models.UserModel;
|
|
||||||
import org.keycloak.services.managers.ClientManager;
|
|
||||||
import org.keycloak.services.managers.RealmManager;
|
|
||||||
import org.keycloak.sessions.AuthenticationSessionModel;
|
|
||||||
import org.keycloak.sessions.CommonClientSessionModel;
|
|
||||||
import org.keycloak.sessions.RootAuthenticationSessionModel;
|
|
||||||
import org.keycloak.testsuite.rule.KeycloakRule;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
|
|
||||||
*/
|
|
||||||
public class AuthenticationSessionProviderTest {
|
|
||||||
|
|
||||||
@ClassRule
|
|
||||||
public static KeycloakRule kc = new KeycloakRule();
|
|
||||||
|
|
||||||
private KeycloakSession session;
|
|
||||||
private RealmModel realm;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void before() {
|
|
||||||
session = kc.startSession();
|
|
||||||
realm = session.realms().getRealm("test");
|
|
||||||
session.users().addUser(realm, "user1").setEmail("user1@localhost");
|
|
||||||
session.users().addUser(realm, "user2").setEmail("user2@localhost");
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void after() {
|
|
||||||
resetSession();
|
|
||||||
UserModel user1 = session.users().getUserByUsername("user1", realm);
|
|
||||||
UserModel user2 = session.users().getUserByUsername("user2", realm);
|
|
||||||
|
|
||||||
UserManager um = new UserManager(session);
|
|
||||||
if (user1 != null) {
|
|
||||||
um.removeUser(realm, user1);
|
|
||||||
}
|
|
||||||
if (user2 != null) {
|
|
||||||
um.removeUser(realm, user2);
|
|
||||||
}
|
|
||||||
kc.stopSession(session, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resetSession() {
|
|
||||||
kc.stopSession(session, true);
|
|
||||||
session = kc.startSession();
|
|
||||||
realm = session.realms().getRealm("test");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testLoginSessionsCRUD() {
|
|
||||||
ClientModel client1 = realm.getClientByClientId("test-app");
|
|
||||||
UserModel user1 = session.users().getUserByUsername("user1", realm);
|
|
||||||
|
|
||||||
RootAuthenticationSessionModel rootAuthSession = session.authenticationSessions().createRootAuthenticationSession(realm);
|
|
||||||
AuthenticationSessionModel authSession = rootAuthSession.createAuthenticationSession(client1);
|
|
||||||
|
|
||||||
String tabId = authSession.getTabId();
|
|
||||||
|
|
||||||
authSession.setAction("foo");
|
|
||||||
rootAuthSession.setTimestamp(100);
|
|
||||||
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
client1 = realm.getClientByClientId("test-app");
|
|
||||||
|
|
||||||
// Ensure session is here
|
|
||||||
rootAuthSession = session.authenticationSessions().getRootAuthenticationSession(realm, rootAuthSession.getId());
|
|
||||||
authSession = rootAuthSession.getAuthenticationSession(client1, tabId);
|
|
||||||
testAuthenticationSession(authSession, client1.getId(), null, "foo");
|
|
||||||
Assert.assertEquals(100, rootAuthSession.getTimestamp());
|
|
||||||
|
|
||||||
// Update and commit
|
|
||||||
authSession.setAction("foo-updated");
|
|
||||||
rootAuthSession.setTimestamp(200);
|
|
||||||
authSession.setAuthenticatedUser(session.users().getUserByUsername("user1", realm));
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
// Ensure session was updated
|
|
||||||
rootAuthSession = session.authenticationSessions().getRootAuthenticationSession(realm, rootAuthSession.getId());
|
|
||||||
client1 = realm.getClientByClientId("test-app");
|
|
||||||
authSession = rootAuthSession.getAuthenticationSession(client1, tabId);
|
|
||||||
testAuthenticationSession(authSession, client1.getId(), user1.getId(), "foo-updated");
|
|
||||||
Assert.assertEquals(200, rootAuthSession.getTimestamp());
|
|
||||||
|
|
||||||
// Remove and commit
|
|
||||||
session.authenticationSessions().removeRootAuthenticationSession(realm, rootAuthSession);
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
// Ensure session was removed
|
|
||||||
Assert.assertNull(session.authenticationSessions().getRootAuthenticationSession(realm, rootAuthSession.getId()));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAuthenticationSessionRestart() {
|
|
||||||
ClientModel client1 = realm.getClientByClientId("test-app");
|
|
||||||
UserModel user1 = session.users().getUserByUsername("user1", realm);
|
|
||||||
|
|
||||||
AuthenticationSessionModel authSession = session.authenticationSessions().createRootAuthenticationSession(realm).createAuthenticationSession(client1);
|
|
||||||
String tabId = authSession.getTabId();
|
|
||||||
|
|
||||||
authSession.setAction("foo");
|
|
||||||
authSession.getParentSession().setTimestamp(100);
|
|
||||||
|
|
||||||
authSession.setAuthenticatedUser(user1);
|
|
||||||
authSession.setAuthNote("foo", "bar");
|
|
||||||
authSession.setClientNote("foo2", "bar2");
|
|
||||||
authSession.setExecutionStatus("123", CommonClientSessionModel.ExecutionStatus.SUCCESS);
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
// Test restart root authentication session
|
|
||||||
client1 = realm.getClientByClientId("test-app");
|
|
||||||
authSession = session.authenticationSessions().getRootAuthenticationSession(realm, authSession.getParentSession().getId())
|
|
||||||
.getAuthenticationSession(client1, tabId);
|
|
||||||
authSession.getParentSession().restartSession(realm);
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
RootAuthenticationSessionModel rootAuthSession = session.authenticationSessions().getRootAuthenticationSession(realm, authSession.getParentSession().getId());
|
|
||||||
Assert.assertNull(rootAuthSession.getAuthenticationSession(client1, tabId));
|
|
||||||
Assert.assertTrue(rootAuthSession.getTimestamp() > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testExpiredAuthSessions() {
|
|
||||||
try {
|
|
||||||
realm.setAccessCodeLifespan(10);
|
|
||||||
realm.setAccessCodeLifespanUserAction(10);
|
|
||||||
realm.setAccessCodeLifespanLogin(30);
|
|
||||||
|
|
||||||
// Login lifespan is largest
|
|
||||||
String authSessionId = session.authenticationSessions().createRootAuthenticationSession(realm).getId();
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
Time.setOffset(25);
|
|
||||||
session.authenticationSessions().removeExpired(realm);
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
assertNotNull(session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId));
|
|
||||||
|
|
||||||
Time.setOffset(35);
|
|
||||||
session.authenticationSessions().removeExpired(realm);
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
assertNull(session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId));
|
|
||||||
|
|
||||||
// User action is largest
|
|
||||||
realm.setAccessCodeLifespanUserAction(40);
|
|
||||||
|
|
||||||
Time.setOffset(0);
|
|
||||||
authSessionId = session.authenticationSessions().createRootAuthenticationSession(realm).getId();
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
Time.setOffset(35);
|
|
||||||
session.authenticationSessions().removeExpired(realm);
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
assertNotNull(session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId));
|
|
||||||
|
|
||||||
Time.setOffset(45);
|
|
||||||
session.authenticationSessions().removeExpired(realm);
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
assertNull(session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId));
|
|
||||||
|
|
||||||
// Access code is largest
|
|
||||||
realm.setAccessCodeLifespan(50);
|
|
||||||
|
|
||||||
Time.setOffset(0);
|
|
||||||
authSessionId = session.authenticationSessions().createRootAuthenticationSession(realm).getId();
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
Time.setOffset(45);
|
|
||||||
session.authenticationSessions().removeExpired(realm);
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
assertNotNull(session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId));
|
|
||||||
|
|
||||||
Time.setOffset(55);
|
|
||||||
session.authenticationSessions().removeExpired(realm);
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
assertNull(session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId));
|
|
||||||
} finally {
|
|
||||||
Time.setOffset(0);
|
|
||||||
|
|
||||||
realm.setAccessCodeLifespan(60);
|
|
||||||
realm.setAccessCodeLifespanUserAction(300);
|
|
||||||
realm.setAccessCodeLifespanLogin(1800);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testOnRealmRemoved() {
|
|
||||||
RealmModel fooRealm = session.realms().createRealm("foo-realm");
|
|
||||||
ClientModel fooClient = fooRealm.addClient("foo-client");
|
|
||||||
|
|
||||||
String authSessionId = session.authenticationSessions().createRootAuthenticationSession(realm).getId();
|
|
||||||
String authSessionId2 = session.authenticationSessions().createRootAuthenticationSession(fooRealm).getId();
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
new RealmManager(session).removeRealm(session.realms().getRealmByName("foo-realm"));
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
RootAuthenticationSessionModel authSession = session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId);
|
|
||||||
Assert.assertNotNull(authSession);
|
|
||||||
Assert.assertNull(session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId2));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testOnClientRemoved() {
|
|
||||||
String authSessionId = session.authenticationSessions().createRootAuthenticationSession(realm).getId();
|
|
||||||
AuthenticationSessionModel authSession1 = session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId).createAuthenticationSession(realm.getClientByClientId("test-app"));
|
|
||||||
AuthenticationSessionModel authSession2 = session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId).createAuthenticationSession(realm.getClientByClientId("third-party"));
|
|
||||||
String tab1Id = authSession1.getTabId();
|
|
||||||
String tab2Id = authSession2.getTabId();
|
|
||||||
|
|
||||||
authSession1.setAuthNote("foo", "bar");
|
|
||||||
authSession2.setAuthNote("foo", "baz");
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
RootAuthenticationSessionModel rootAuthSession = session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId);
|
|
||||||
Assert.assertEquals(2, rootAuthSession.getAuthenticationSessions().size());
|
|
||||||
Assert.assertEquals("bar", rootAuthSession.getAuthenticationSession(realm.getClientByClientId("test-app"), tab1Id).getAuthNote("foo"));
|
|
||||||
Assert.assertEquals("baz", rootAuthSession.getAuthenticationSession(realm.getClientByClientId("third-party"), tab2Id).getAuthNote("foo"));
|
|
||||||
|
|
||||||
new ClientManager(new RealmManager(session)).removeClient(realm, realm.getClientByClientId("third-party"));
|
|
||||||
|
|
||||||
resetSession();
|
|
||||||
|
|
||||||
rootAuthSession = session.authenticationSessions().getRootAuthenticationSession(realm, authSessionId);
|
|
||||||
Assert.assertEquals("bar", rootAuthSession.getAuthenticationSession(realm.getClientByClientId("test-app"), tab1Id).getAuthNote("foo"));
|
|
||||||
Assert.assertNull(rootAuthSession.getAuthenticationSession(realm.getClientByClientId("third-party"), tab2Id));
|
|
||||||
|
|
||||||
// Revert client
|
|
||||||
realm.addClient("third-party");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void testAuthenticationSession(AuthenticationSessionModel authSession, String expectedClientId, String expectedUserId, String expectedAction) {
|
|
||||||
Assert.assertEquals(expectedClientId, authSession.getClient().getId());
|
|
||||||
|
|
||||||
if (expectedUserId == null) {
|
|
||||||
Assert.assertNull(authSession.getAuthenticatedUser());
|
|
||||||
} else {
|
|
||||||
Assert.assertEquals(expectedUserId, authSession.getAuthenticatedUser().getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (expectedAction == null) {
|
|
||||||
Assert.assertNull(authSession.getAction());
|
|
||||||
} else {
|
|
||||||
Assert.assertEquals(expectedAction, authSession.getAction());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue