package uk.ac.ox.zoo.seeg.abraid.mp.publicsite.security;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import uk.ac.ox.zoo.seeg.abraid.mp.common.domain.Expert;
import uk.ac.ox.zoo.seeg.abraid.mp.common.service.core.ExpertService;
import uk.ac.ox.zoo.seeg.abraid.mp.publicsite.domain.PublicSiteUser;
import java.util.ArrayList;
import java.util.Collection;
/**
* Service to load Expert via ExpertService, as a Spring UserDetails.
* Copyright (c) 2014 University of Oxford
*/
public class UserDetailsServiceImpl implements UserDetailsService {
private static final String ROLE_USER = "ROLE_USER";
private static final String ROLE_ADMIN = "ROLE_ADMIN";
private static final String ROLE_SEEG = "ROLE_SEEG";
private ExpertService expertService;
public UserDetailsServiceImpl(ExpertService expertService) {
this.expertService = expertService;
}
@Override
public UserDetails loadUserByUsername(String emailAddress) throws UsernameNotFoundException {
Expert expert = expertService.getExpertByEmail(emailAddress);
if (expert == null) {
throw new UsernameNotFoundException("User not found");
}
return buildUserFromExpert(expert);
}
private User buildUserFromExpert(Expert expert) {
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(ROLE_USER));
if (expert.isAdministrator()) {
authorities.add(new SimpleGrantedAuthority(ROLE_ADMIN));
}
if (expert.isSeegMember()) {
authorities.add(new SimpleGrantedAuthority(ROLE_SEEG));
}
return new PublicSiteUser(
expert.getId(),
expert.getEmail(),
expert.getName(),
expert.getPassword(),
authorities);
}
}