/* ==================================================================== * * Copyright (C) 2015 GeoSolutions S.A.S. * http://www.geo-solutions.it * * GPLv3 + Classpath exception * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * * ==================================================================== * * This software consists of voluntary contributions made by developers * of GeoSolutions. For more information on GeoSolutions, please see * <http://www.geo-solutions.it/>. * */ package it.geosolutions.geostore.core.security; import it.geosolutions.geostore.core.model.User; import it.geosolutions.geostore.core.model.UserAttribute; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; /** * Implementation of UserMapper that maps attributes from a generic object * to GeoStore User attributes. Mappings are expressed using SpEL expressions. * * Inherited classes should add their propertyAccessor implementations to the evaluationContext. * * @author Mauro Bartolomeoli * */ public abstract class ExpressionUserMapper implements UserMapper { Map<String, String> attributeMappings; public static SpelExpressionParser parser = new SpelExpressionParser(); protected StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); /** * * @param attributeMappings maps attribute names to SpEL expressions (using a UserDetailsWithAttributes * source) */ public ExpressionUserMapper(Map<String, String> attributeMappings) { this.attributeMappings = attributeMappings; } @Override /** * If details is a UserDetailsWithAttributes object, its attributes are mapped to User * attributes. * Each mapping is an SpEL expression using the UserDetailsWithAttributes as a source. * */ public void mapUser(Object details, User user) { List<UserAttribute> attributes = new ArrayList<UserAttribute>(); details = preProcessDetails(details); for(String attributeName : attributeMappings.keySet()) { Expression exp = parser.parseExpression(attributeMappings.get(attributeName)); UserAttribute userAttribute = new UserAttribute(); userAttribute.setName(attributeName); Object value = exp.getValue(evaluationContext, details); userAttribute.setValue(value == null ? null : value.toString()); attributes.add(userAttribute); } user.setAttribute(attributes); } protected Object preProcessDetails(Object details) { return details; } }