Package org.geoserver.security.rememberme

Source Code of org.geoserver.security.rememberme.RememberMeUserDetailsService

/* (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.rememberme;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.geoserver.security.GeoServerSecurityManager;
import org.geoserver.security.GeoServerUserGroupService;
import org.geoserver.security.impl.UserDetailsWrapper;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

/**
* User details implementation for remember me services that handles usernames of the form
* <actualUserName>@<userGroupServiceName>.
* <p>
* The user group component is used to load the appropriate {@link GeoServerUserGroupService}
* to look up the user name against. 
* </p>
* @author Justin Deoliveira, OpenGeo
*
*/
public class RememberMeUserDetailsService implements UserDetailsService {
       
    public static class RememberMeUserDetails extends UserDetailsWrapper {
       
        private static final long serialVersionUID = 1L;
        private String userGroupServiceName;
       
        public RememberMeUserDetails (UserDetails details, String userGroupServiceName) {
            super(details);
            this.userGroupServiceName=userGroupServiceName;
        }
        @Override
        public String getUsername() {
            return super.getUsername().replace("@", "\\@")+"@"+userGroupServiceName;
           
        }
    }
   
    /** pattern used to parse username@userGroupServiceName token */
    static Pattern TOKEN_PATTERN = Pattern.compile("(.*[^\\\\])@(.*)");
           
    GeoServerSecurityManager securityManager;

    public RememberMeUserDetailsService(GeoServerSecurityManager securityManager) {
        this.securityManager = securityManager;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException,
            DataAccessException {
        Matcher m = TOKEN_PATTERN.matcher(username);
        if (!m.matches()) {
            throw new UsernameNotFoundException("No delimiter '@' found in username: " + username);
        }

        String user = m.group(1).replace("\\@", "@");
        String service = m.group(2);

        try {
            GeoServerUserGroupService ugService = securityManager.loadUserGroupService(service);
            return new RememberMeUserDetails(ugService.loadUserByUsername(user),service);
        } catch (IOException e) {
            throw new DataAccessException("Error loading user group service " + service, e) {};
        }
    }
}
TOP

Related Classes of org.geoserver.security.rememberme.RememberMeUserDetailsService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.