/* * #%L * BroadleafCommerce Open Admin Platform * %% * Copyright (C) 2009 - 2013 Broadleaf Commerce * %% * Licensed 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. * #L% */ package org.broadleafcommerce.openadmin.web.filter; import org.broadleafcommerce.common.persistence.EntityConfiguration; import org.broadleafcommerce.common.security.BroadleafExternalAuthenticationUserDetails; import org.broadleafcommerce.openadmin.server.security.domain.AdminRole; import org.broadleafcommerce.openadmin.server.security.domain.AdminUser; import org.broadleafcommerce.openadmin.server.security.service.AdminSecurityService; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.filter.GenericFilterBean; import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.annotation.Resource; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; /** * This class provides a filter to be used with External Security Providers (e.g. LDAP). When authentication is performed against * another system it is important to provision an admin user in Broadleaf and set up the appropriate roles. * This class checks to see if a user exists and if not, creates one. It also replaces all roles associated with a user with roles that * match their Authentication credentials. DO NOT USE THIS FILTER UNLESS YOU ARE AUTHENTICATING AGAINST AN EXTERNAL * SOURCE SUCH AS LDAP. * * @deprecated NO LONGER REQUIRED AND SHOULD NOT BE USED. SEE BroadleafAdminLdapUserDetailsMapper. * * <p/> * User: Kelly Tisdell * Date: 6/19/12 */ @Deprecated public class AdminExternalLoginStateFilter extends GenericFilterBean { protected static final String BLC_ADMIN_PROVISION_USER_CHECK = "BLC_ADMIN_PROVISION_USER_CHECK"; @Resource(name="blAdminSecurityService") private AdminSecurityService adminSecurityService; @Resource(name="blEntityConfiguration") private EntityConfiguration entityConfiguration; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; if (request.getSession(true).getAttribute(BLC_ADMIN_PROVISION_USER_CHECK) == null) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.isAuthenticated()) { if (authentication.getPrincipal() instanceof UserDetails){ UserDetails userDetails = (UserDetails)authentication.getPrincipal(); if (userDetails != null && userDetails.getUsername() != null) { AdminUser user = adminSecurityService.readAdminUserByUserName(userDetails.getUsername()); if (userDetails instanceof BroadleafExternalAuthenticationUserDetails) { BroadleafExternalAuthenticationUserDetails broadleafUser = (BroadleafExternalAuthenticationUserDetails)userDetails; if (user == null) { //Provision a new user... user = (AdminUser)entityConfiguration.createEntityInstance(AdminUser.class.getName()); } saveAdminUser(broadleafUser, user); request.getSession().setAttribute(BLC_ADMIN_PROVISION_USER_CHECK, Boolean.TRUE); } } } } } filterChain.doFilter(servletRequest, servletResponse); } protected void saveAdminUser(BroadleafExternalAuthenticationUserDetails broadleafUser, AdminUser user) { //Name, login, password, email are required. user.setLogin(broadleafUser.getUsername()); user.setUnencodedPassword(broadleafUser.getPassword()); if (user.getUnencodedPassword() == null) { //If Spring is configured to erase credentials, then this will always be null //Set the username as a default password here. user.setUnencodedPassword(user.getLogin()); } StringBuffer name = new StringBuffer(); if (broadleafUser.getFirstName() != null && broadleafUser.getFirstName().trim().length() > 0) { name.append(broadleafUser.getFirstName().trim()); name.append(" "); } if (broadleafUser.getLastName() != null && broadleafUser.getLastName().trim().length() > 0) { name.append(broadleafUser.getLastName().trim()); } user.setName(name.toString()); user.setEmail(broadleafUser.getEmail()); Set<AdminRole> roleSet = user.getAllRoles(); //First, remove all roles associated with the user if they already existed if (roleSet != null){ roleSet.clear(); } else { roleSet = new HashSet<AdminRole>(); user.setAllRoles(roleSet); } //Now add the appropriate roles back in List<AdminRole> availableRoles = adminSecurityService.readAllAdminRoles(); if (availableRoles != null) { HashMap<String, AdminRole> roleMap = new HashMap<String, AdminRole>(); for (AdminRole role : availableRoles) { roleMap.put(role.getName(), role); } Collection<GrantedAuthority> authorities = broadleafUser.getAuthorities(); for (GrantedAuthority authority : authorities) { if (roleMap.get(authority.getAuthority()) != null){ roleSet.add(roleMap.get(authority.getAuthority())); } } } //Save the user data and all of the roles... adminSecurityService.saveAdminUser(user); } }