package org.lognavigator.service;

import java.util.Set;
import java.util.TreeSet;

import org.lognavigator.bean.LogAccessConfig;
import org.lognavigator.exception.AuthorizationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Service;


@Service
public class DefaultAuthorizationService implements AuthorizationService {

	@Override
	public void checkUserAuthorizationFor(LogAccessConfig logAccessConfig, Authentication authenticatedUser) throws AuthorizationException {
		
		// Check userName of the connected user
		if (!logAccessConfig.isEveryUserAuthorized()) {
			String userName = (authenticatedUser != null) ? authenticatedUser.getName() : null;

			// Case where user is unauthenticated
			if (userName == null) {
				throw new AuthorizationException("You are not authenticated. Authentication is needed to access to these logs");
			}
			for (String authorizedUser : logAccessConfig.getAuthorizedUsers()) {
				if (authorizedUser.equalsIgnoreCase(userName)) {
					return;
				}
			}
			// Case where user is not in the authorized users list
			if (logAccessConfig.isEveryRoleAuthorized()) {
				throw new AuthorizationException("Your userName is not authorized to access to these logs");
			}
		}
		
		// Check roles of the connected user
		if (!logAccessConfig.isEveryRoleAuthorized()) {
			if (authenticatedUser != null) {
				for (String authorizedRole : logAccessConfig.getAuthorizedRoles()) {
					for (GrantedAuthority userRole : authenticatedUser.getAuthorities()) {
						if (authorizedRole.equals(userRole.getAuthority())) {
							return;
						}
					}
				}
			}
			// Case where user has no role in the authorized roles list
			throw new AuthorizationException("You don't have any role authorized to access to these logs");
		}
	}
	
	@Override
	public Set<LogAccessConfig> getAuthorizedLogAccessConfigs(Set<LogAccessConfig> allLogAccessConfigs, Authentication authenticatedUser) {
		
		Set<LogAccessConfig> authorizedLogAccessConfigs = new TreeSet<LogAccessConfig>();
		
		for (LogAccessConfig logAccessConfig : allLogAccessConfigs) {
			try {
				checkUserAuthorizationFor(logAccessConfig, authenticatedUser);
				authorizedLogAccessConfigs.add(logAccessConfig);
			}
			catch (AuthorizationException e) {
				// Do not add to authorized log access configs
			}
		}
		
		// Return filtered authorized log access configs for authenticatedUser
		return authorizedLogAccessConfigs;
	}

}

package org.lognavigator.service;

import java.util.Set;
import java.util.TreeSet;

import org.lognavigator.bean.LogAccessConfig;
import org.lognavigator.exception.AuthorizationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Service;


@Service
public class DefaultAuthorizationService implements AuthorizationService {

	@Override
	public void checkUserAuthorizationFor(LogAccessConfig logAccessConfig, Authentication authenticatedUser) throws AuthorizationException {
		
		// Check userName of the connected user
		if (!logAccessConfig.isEveryUserAuthorized()) {
			String userName = (authenticatedUser != null) ? authenticatedUser.getName() : null;

			// Case where user is unauthenticated
			if (userName == null) {
				throw new AuthorizationException("You are not authenticated. Authentication is needed to access to " + logAccessConfig.getId());
			}
			for (String authorizedUser : logAccessConfig.getAuthorizedUsers()) {
				if (authorizedUser.equalsIgnoreCase(userName)) {
					return;
				}
			}
			// Case where user is not in the authorized users list
			if (logAccessConfig.isEveryRoleAuthorized()) {
				throw new AuthorizationException("Your userName is not authorized to access to " + logAccessConfig.getId());
			}
		}
		
		// Check roles of the connected user
		if (!logAccessConfig.isEveryRoleAuthorized()) {
			if (authenticatedUser != null) {
				for (String authorizedRole : logAccessConfig.getAuthorizedRoles()) {
					for (GrantedAuthority userRole : authenticatedUser.getAuthorities()) {
						if (authorizedRole.equals(userRole.getAuthority())) {
							return;
						}
					}
				}
			}
			// Case where user has no role in the authorized roles list
			throw new AuthorizationException("You don't have any role authorized to access to " + logAccessConfig.getId());
		}
	}
	
	@Override
	public Set<LogAccessConfig> getAuthorizedLogAccessConfigs(Set<LogAccessConfig> allLogAccessConfigs, Authentication authenticatedUser) {
		
		Set<LogAccessConfig> authorizedLogAccessConfigs = new TreeSet<LogAccessConfig>();
		
		for (LogAccessConfig logAccessConfig : allLogAccessConfigs) {
			try {
				checkUserAuthorizationFor(logAccessConfig, authenticatedUser);
				authorizedLogAccessConfigs.add(logAccessConfig);
			}
			catch (AuthorizationException e) {
				// Do not add to authorized log access configs
			}
		}
		
		// Return filtered authorized log access configs for authenticatedUser
		return authorizedLogAccessConfigs;
	}

}

Enhance 'AccessDenied' error messages : logAccessConfigId is now indicated