package org.constellation.services.security; import javax.servlet.http.HttpServletRequest; import org.constellation.engine.security.UserDetailsExtractor; import org.constellation.services.component.TokenService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.codec.Base64; import org.springframework.util.StringUtils; public class CstlUserDetailsExtractor implements UserDetailsExtractor{ private static final Logger LOGGER = LoggerFactory.getLogger(CstlUserDetailsExtractor.class); private UserDetailsService userDetailsService; private TokenService tokenService; @Override public UserDetails userDetails(HttpServletRequest httpServletRequest) { UserDetails userDetails = fromToken(httpServletRequest); if (userDetails == null ) userDetails = fromBasicAuth(httpServletRequest); return userDetails; } public UserDetailsService getUserDetailsService() { return userDetailsService; } public void setUserDetailsService(UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; } public TokenService getTokenService() { return tokenService; } public void setTokenService(TokenService tokenService) { this.tokenService = tokenService; } private UserDetails fromBasicAuth(HttpServletRequest httpRequest) { String userName = basicAuth(httpRequest); if (userName == null) return null; try { return userDetailsService.loadUserByUsername(userName); } catch (UsernameNotFoundException ex) { LOGGER.debug("Unable to find the user "+userName, ex); return null; } } private UserDetails fromToken(HttpServletRequest httpRequest) { String userName = tokenService.getUserName(httpRequest); if (userName == null) return null; return userDetailsService.loadUserByUsername(userName); } private String basicAuth(HttpServletRequest httpRequest) { String header = httpRequest.getHeader("Authorization"); if (StringUtils.hasLength(header) && header.length() > 6) { assert header.substring(0, 6).equals("Basic "); // will contain "Ym9iOnNlY3JldA==" String basicAuthEncoded = header.substring(6); // will contain "bob:secret" String basicAuthAsString = new String(Base64.decode(basicAuthEncoded.getBytes())); int indexOf = basicAuthAsString.indexOf(':'); if (indexOf != -1) { String username = basicAuthAsString.substring(0, indexOf); LOGGER.debug("Basic auth: " + username); return username; } } return null; } }