// Path: modules/cloud-portal-server/src/main/java/de/papke/cloud/portal/pojo/User.java
// public class User implements Serializable {
// 
// 	private static final long serialVersionUID = 1L;
// 	
// 	private String username;
// 	private String givenName;
// 	private String surName;
// 	private String email;
// 	private List<String> groups;
// 	private boolean admin;
// 	
// 	public User() {}
// 	
// 	public User(String username, String givenName, String surName, String email, List<String> groups, boolean admin) {
// 		super();
// 		this.givenName = givenName;
// 		this.surName = surName;
// 		this.username = username;
// 		this.email = email;
// 		this.groups = groups;
// 		this.admin = admin;
// 	}
// 	
// 	public String getUsername() {
// 		return username;
// 	}
// 	
// 	public void setUsername(String username) {
// 		this.username = username;
// 	}
// 	
// 	public String getGivenName() {
// 		return givenName;
// 	}
// 
// 	public void setGivenName(String givenName) {
// 		this.givenName = givenName;
// 	}
// 
// 	public String getSurName() {
// 		return surName;
// 	}
// 
// 	public void setSurName(String surName) {
// 		this.surName = surName;
// 	}
// 
// 	public String getEmail() {
// 		return email;
// 	}
// 	
// 	public void setEmail(String email) {
// 		this.email = email;
// 	}
// 	
// 	public List<String> getGroups() {
// 		return groups;
// 	}
// 	
// 	public void setGroups(List<String> groups) {
// 		this.groups = groups;
// 	}
// 
// 	public boolean isAdmin() {
// 		return admin;
// 	}
// 
// 	public void setAdmin(boolean admin) {
// 		this.admin = admin;
// 	}
// }
// 
// Path: modules/cloud-portal-server/src/main/java/de/papke/cloud/portal/service/SessionUserService.java
// @Service
// public class SessionUserService {
// 	
// 	private static final String SESSION_ATTRIBUTE_USER = "user";
// 	private static final User DUMMY_USER = new User("anonymous", "Anonymous", "User", "dummy@dummy.com", new ArrayList<>(), false);
// 	
// 	@Autowired
// 	private HttpSession session;
// 
// 	public User getUser() {
// 		
// 		User user = (User) session.getAttribute(SESSION_ATTRIBUTE_USER);
// 		
// 		if (user == null) {
// 			user = DUMMY_USER; 
// 		}
// 		
// 		return user;
// 	}
// 	
// 	public boolean isAdmin() {
// 		return getUser().isAdmin();
// 	}
// 	
// 	public boolean isAllowed() {
// 		return isAdmin();
// 	}
// 
// 	public boolean isAllowed(ProvisionLog provisionLog) {
// 		return isAdmin() || getUser().getGroups().contains(provisionLog.getGroup());
// 	}
// 	
// 	public void setUser(User user) {
// 		session.setAttribute(SESSION_ATTRIBUTE_USER, user);
// 	}
// }
// 
// Path: modules/cloud-portal-server/src/main/java/de/papke/cloud/portal/service/UserService.java
// @Service
// public class UserService {
// 
// 	private static final Logger LOG = LoggerFactory.getLogger(UserService.class);
// 
// 	@Value("${APPLICATION_ADMIN_GROUP}")
// 	private String adminGroup;	
// 
// 	@Autowired
// 	private DirectoryService directoryService;
// 
// 	public User getUser(String username) {
// 
// 		User user = null;
// 
// 		try {
// 
// 			user = directoryService.getUser(username);
// 			
// 			if (user.getGroups() != null) {
// 				for (String group : user.getGroups()) {
// 					if (group.equals(adminGroup)) {
// 						user.setAdmin(true);
// 						break;
// 					}
// 				}
// 			}
// 		}
// 		catch(Exception e) {
// 			LOG.error(e.getMessage(), e);
// 		}
// 		
// 		return user;
// 	}
// 	
// 	public boolean authenticate(String username, String password) {
// 		return directoryService.authenticate(username, password);
// 	}	
// }


import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;
import de.papke.cloud.portal.pojo.User;
import de.papke.cloud.portal.service.SessionUserService;
import de.papke.cloud.portal.service.UserService;
package de.papke.cloud.portal.auth;




@Component
public class DirectoryAuthenticationProvider implements AuthenticationProvider {

	@Autowired
	private UserService userService;

	@Autowired
	private SessionUserService sessionUserService;
    
    @Override
    public Authentication authenticate(Authentication authentication) {
        
        Authentication auth = null;

        // get username and password from authentication object
        String username = (String) authentication.getPrincipal();
        String password = (String) authentication.getCredentials();        

        // authenticate user
        if (userService.authenticate(username, password)) {
            
            // get user
// Path: modules/cloud-portal-server/src/main/java/de/papke/cloud/portal/pojo/User.java
// public class User implements Serializable {
// 
// 	private static final long serialVersionUID = 1L;
// 	
// 	private String username;
// 	private String givenName;
// 	private String surName;
// 	private String email;
// 	private List<String> groups;
// 	private boolean admin;
// 	
// 	public User() {}
// 	
// 	public User(String username, String givenName, String surName, String email, List<String> groups, boolean admin) {
// 		super();
// 		this.givenName = givenName;
// 		this.surName = surName;
// 		this.username = username;
// 		this.email = email;
// 		this.groups = groups;
// 		this.admin = admin;
// 	}
// 	
// 	public String getUsername() {
// 		return username;
// 	}
// 	
// 	public void setUsername(String username) {
// 		this.username = username;
// 	}
// 	
// 	public String getGivenName() {
// 		return givenName;
// 	}
// 
// 	public void setGivenName(String givenName) {
// 		this.givenName = givenName;
// 	}
// 
// 	public String getSurName() {
// 		return surName;
// 	}
// 
// 	public void setSurName(String surName) {
// 		this.surName = surName;
// 	}
// 
// 	public String getEmail() {
// 		return email;
// 	}
// 	
// 	public void setEmail(String email) {
// 		this.email = email;
// 	}
// 	
// 	public List<String> getGroups() {
// 		return groups;
// 	}
// 	
// 	public void setGroups(List<String> groups) {
// 		this.groups = groups;
// 	}
// 
// 	public boolean isAdmin() {
// 		return admin;
// 	}
// 
// 	public void setAdmin(boolean admin) {
// 		this.admin = admin;
// 	}
// }
// 
// Path: modules/cloud-portal-server/src/main/java/de/papke/cloud/portal/service/SessionUserService.java
// @Service
// public class SessionUserService {
// 	
// 	private static final String SESSION_ATTRIBUTE_USER = "user";
// 	private static final User DUMMY_USER = new User("anonymous", "Anonymous", "User", "dummy@dummy.com", new ArrayList<>(), false);
// 	
// 	@Autowired
// 	private HttpSession session;
// 
// 	public User getUser() {
// 		
// 		User user = (User) session.getAttribute(SESSION_ATTRIBUTE_USER);
// 		
// 		if (user == null) {
// 			user = DUMMY_USER; 
// 		}
// 		
// 		return user;
// 	}
// 	
// 	public boolean isAdmin() {
// 		return getUser().isAdmin();
// 	}
// 	
// 	public boolean isAllowed() {
// 		return isAdmin();
// 	}
// 
// 	public boolean isAllowed(ProvisionLog provisionLog) {
// 		return isAdmin() || getUser().getGroups().contains(provisionLog.getGroup());
// 	}
// 	
// 	public void setUser(User user) {
// 		session.setAttribute(SESSION_ATTRIBUTE_USER, user);
// 	}
// }
// 
// Path: modules/cloud-portal-server/src/main/java/de/papke/cloud/portal/service/UserService.java
// @Service
// public class UserService {
// 
// 	private static final Logger LOG = LoggerFactory.getLogger(UserService.class);
// 
// 	@Value("${APPLICATION_ADMIN_GROUP}")
// 	private String adminGroup;	
// 
// 	@Autowired
// 	private DirectoryService directoryService;
// 
// 	public User getUser(String username) {
// 
// 		User user = null;
// 
// 		try {
// 
// 			user = directoryService.getUser(username);
// 			
// 			if (user.getGroups() != null) {
// 				for (String group : user.getGroups()) {
// 					if (group.equals(adminGroup)) {
// 						user.setAdmin(true);
// 						break;
// 					}
// 				}
// 			}
// 		}
// 		catch(Exception e) {
// 			LOG.error(e.getMessage(), e);
// 		}
// 		
// 		return user;
// 	}
// 	
// 	public boolean authenticate(String username, String password) {
// 		return directoryService.authenticate(username, password);
// 	}	
// }


// Path: modules/cloud-portal-server/src/main/java/de/papke/cloud/portal/auth/DirectoryAuthenticationProvider.java
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;
import de.papke.cloud.portal.pojo.User;
import de.papke.cloud.portal.service.SessionUserService;
import de.papke.cloud.portal.service.UserService;

package de.papke.cloud.portal.auth;




@Component
public class DirectoryAuthenticationProvider implements AuthenticationProvider {

	@Autowired
	private UserService userService;

	@Autowired
	private SessionUserService sessionUserService;
    
    @Override
    public Authentication authenticate(Authentication authentication) {
        
        Authentication auth = null;

        // get username and password from authentication object
        String username = (String) authentication.getPrincipal();
        String password = (String) authentication.getCredentials();        

        // authenticate user
        if (userService.authenticate(username, password)) {
            
            // get user
            User user = userService.getUser(username);