/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.isis.core.runtime.authentication.exploration; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; import org.apache.isis.core.commons.authentication.AuthenticationSession; import org.apache.isis.core.commons.config.IsisConfiguration; import org.apache.isis.core.runtime.authentication.AuthenticationRequest; import org.apache.isis.core.runtime.authentication.standard.AuthenticatorAbstract; import org.apache.isis.core.runtime.authentication.standard.SimpleSession; /** * Creates a session suitable for {@link org.apache.isis.core.metamodel.deployment.DeploymentCategory#PROTOTYPING} * mode. * * <p> * The format of the {@value ExplorationAuthenticatorConstants#USERS} key should * be: * * <pre> * <:userName> [:<role>[|<role>]...], <userName>... * </pre> */ public class ExplorationAuthenticator extends AuthenticatorAbstract { //region > Constructor, fields private final Set<SimpleSession> registeredSessions = new LinkedHashSet<SimpleSession>();; private final String users; public ExplorationAuthenticator(final IsisConfiguration configuration) { super(configuration); users = getConfiguration().getString(ExplorationAuthenticatorConstants.USERS); if (users != null) { registeredSessions.addAll(parseUsers(users)); } } //endregion private List<SimpleSession> parseUsers(final String users) { final List<SimpleSession> registeredUsers = new ArrayList<SimpleSession>(); final StringTokenizer st = new StringTokenizer(users, ","); while (st.hasMoreTokens()) { final String token = st.nextToken(); final int end = token.indexOf(':'); final List<String> roles = new ArrayList<String>(); final String userName; if (end == -1) { userName = token.trim(); } else { userName = token.substring(0, end).trim(); final String roleList = token.substring(end + 1); final StringTokenizer st2 = new StringTokenizer(roleList, "|"); while (st2.hasMoreTokens()) { final String role = st2.nextToken().trim(); roles.add(role); } } registeredUsers.add(createSimpleSession(userName, roles)); } return registeredUsers; } private SimpleSession createSimpleSession(final String userName, final List<String> roles) { return new SimpleSession(userName, roles.toArray(new String[roles.size()])); } // ////////////////////////////////////////////////////////////////// // API // ////////////////////////////////////////////////////////////////// /** * Can authenticate if a {@link AuthenticationRequestExploration}. */ @Override public final boolean canAuthenticate(final Class<? extends AuthenticationRequest> authenticationRequestClass) { return AuthenticationRequestExploration.class.isAssignableFrom(authenticationRequestClass); } @Override protected final boolean isValid(final AuthenticationRequest request) { return getDeploymentCategory().isExploring(); } @Override public AuthenticationSession authenticate(final AuthenticationRequest request, final String code) { final AuthenticationRequestExploration authenticationRequestExploration = (AuthenticationRequestExploration) request; if (!authenticationRequestExploration.isDefaultUser()) { registeredSessions.add(createSimpleSession(authenticationRequestExploration.getName(), authenticationRequestExploration.getRoles())); } if (registeredSessions.size() >= 1) { return registeredSessions.iterator().next(); } else { return new ExplorationSession(code); } } }