/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.security.impl;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import org.geoserver.platform.resource.Resource;
import org.geoserver.security.GeoServerUserGroupService;
import org.geoserver.security.GeoServerUserGroupStore;
import org.geoserver.security.event.UserGroupLoadedEvent;
import org.geoserver.security.event.UserGroupLoadedListener;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
/**
* Standard implementation of {@link GeoServerUserGroupService}
*
* @author christian
*
*/
public abstract class AbstractUserGroupService extends AbstractGeoServerSecurityService
implements GeoServerUserGroupService {
protected Set<UserGroupLoadedListener> listeners =
Collections.synchronizedSet(new HashSet<UserGroupLoadedListener>());
protected String passwordEncoderName,passwordValidatorName;
protected UserGroupStoreHelper helper;
protected AbstractUserGroupService() {
helper=new UserGroupStoreHelper();
}
@Override
public String getPasswordEncoderName() {
return passwordEncoderName;
}
@Override
public String getPasswordValidatorName() {
return passwordValidatorName;
}
@Override
public GeoServerUserGroupStore createStore() throws IOException {
//return null, subclasses can override if they support a store along with a service
return null;
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#registerUserGroupChangedListener(org.geoserver.security.event.UserGroupChangedListener)
*/
public void registerUserGroupLoadedListener (UserGroupLoadedListener listener) {
listeners.add(listener);
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#unregisterUserGroupChangedListener(org.geoserver.security.event.UserGroupChangedListener)
*/
public void unregisterUserGroupLoadedListener (UserGroupLoadedListener listener) {
listeners.remove(listener);
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#getUserByUsername(java.lang.String)
*/
public GeoServerUser getUserByUsername(String username) throws IOException {
return helper.getUserByUsername(username);
}
public GeoServerUserGroup getGroupByGroupname(String groupname) throws IOException {
return helper.getGroupByGroupname(groupname);
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#getUsers()
*/
public SortedSet<GeoServerUser> getUsers() throws IOException{
return helper.getUsers();
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#getUserGroups()
*/
public SortedSet<GeoServerUserGroup> getUserGroups() throws IOException{
return helper.getUserGroups();
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#createUserObject(java.lang.String, java.lang.String, boolean)
*/
public GeoServerUser createUserObject(String username,String password, boolean isEnabled) throws IOException{
GeoServerUser user = new GeoServerUser(username);
user.setEnabled(isEnabled);
user.setPassword(password);
return user;
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#createGroupObject(java.lang.String, boolean)
*/
public GeoServerUserGroup createGroupObject(String groupname, boolean isEnabled) throws IOException{
GeoServerUserGroup group = new GeoServerUserGroup(groupname);
group.setEnabled(isEnabled);
return group;
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#getGroupsForUser(org.geoserver.security.impl.GeoserverUser)
*/
public SortedSet<GeoServerUserGroup> getGroupsForUser (GeoServerUser user) throws IOException{
return helper.getGroupsForUser(user);
}
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#getUsersForGroup(org.geoserver.security.impl.GeoserverUserGroup)
*/
public SortedSet<GeoServerUser> getUsersForGroup (GeoServerUserGroup group) throws IOException{
return helper.getUsersForGroup(group);
}
/**
* Subclasses must implement this method
* Load user groups from backend
*/
protected abstract void deserialize() throws IOException;
/* (non-Javadoc)
* @see org.geoserver.security.GeoserverUserGroupService#load()
*/
public void load() throws IOException{
LOGGER.info("Start reloading user/groups for service named "+getName());
// prevent concurrent write from store and
// read from service
synchronized (this) {
deserialize();
}
LOGGER.info("Reloading user/groups successful for service named "+getName());
fireUserGroupLoadedEvent();
}
/**
* Fire {@link UserGroupLoadedEvent} for all listeners
*/
protected void fireUserGroupLoadedEvent() {
UserGroupLoadedEvent event = new UserGroupLoadedEvent(this);
for (UserGroupLoadedListener listener : listeners) {
listener.usersAndGroupsChanged(event);
}
}
/**
* internal use, clear the maps
*/
protected void clearMaps() {
helper.clearMaps();
}
/**
* The root configuration for the user group service.
*/
public Resource getConfigRoot() throws IOException {
return getSecurityManager().userGroup().get(getName());
}
/* (non-Javadoc)
* @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException,
DataAccessException {
GeoServerUser user=null;
try {
user = getUserByUsername(username);
if (user==null)
throw new UsernameNotFoundException(userNotFoundMessage(username));
RoleCalculator calculator = new RoleCalculator(this,
getSecurityManager().getActiveRoleService());
user.setAuthorities(calculator.calculateRoles(user));
} catch (IOException e) {
throw new UsernameNotFoundException(userNotFoundMessage(username),e);
}
return user;
}
protected String userNotFoundMessage(String username) {
return "User "+username +
" not found in usergroupservice: "+getName();
}
public int getUserCount() throws IOException {
return helper.getUserCount();
}
public int getGroupCount() throws IOException {
return helper.getGroupCount();
}
@Override
public SortedSet<GeoServerUser> getUsersHavingProperty(String propname) throws IOException {
return helper.getUsersHavingProperty(propname);
}
@Override
public int getUserCountHavingProperty(String propname) throws IOException {
return helper.getUserCountHavingProperty(propname);
}
@Override
public SortedSet<GeoServerUser> getUsersNotHavingProperty(String propname) throws IOException {
return helper.getUsersNotHavingProperty(propname);
}
@Override
public int getUserCountNotHavingProperty(String propname) throws IOException {
return helper.getUserCountNotHavingProperty(propname);
}
@Override
public SortedSet<GeoServerUser> getUsersHavingPropertyValue(String propname, String propvalue)
throws IOException {
return helper.getUsersHavingPropertyValue(propname, propvalue);
}
@Override
public int getUserCountHavingPropertyValue(String propname, String propvalue)
throws IOException {
return helper.getUserCountHavingPropertyValue(propname, propvalue);
}
}