/*******************************************************************************
* Copyright (c) 2015 Development Gateway, Inc and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the MIT License (MIT)
* which accompanies this distribution, and is available at
* https://opensource.org/licenses/MIT
*
* Contributors:
* Development Gateway - initial API and implementation
*******************************************************************************/
package org.devgateway.toolkit.persistence.spring;
import java.util.HashSet;
import java.util.Set;
import org.devgateway.toolkit.persistence.dao.Person;
import org.devgateway.toolkit.persistence.dao.categories.Role;
import org.devgateway.toolkit.persistence.repository.PersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.stereotype.Component;
/**
* {@link UserDetailsService} that uses JPA
*
* @author mpostelnicu, krams
* @see http
* ://krams915.blogspot.fi/2012/01/spring-security-31-implement_3065.html
*/
@Component
public class CustomJPAUserDetailsService implements UserDetailsService {
@Autowired
private PersonRepository personRepository;
/**
* Returns a populated {@link UserDetails} object. The username is first
* retrieved from the database and then mapped to a {@link UserDetails}
* object. We are currently using the {@link User} implementation from
* Spring
*/
@Override
public Person loadUserByUsername(final String username) throws UsernameNotFoundException {
try {
Person domainUser = personRepository.findByUsername(username);
Set<GrantedAuthority> grantedAuthorities = getGrantedAuthorities(domainUser);
domainUser.setAuthorities(grantedAuthorities);
return domainUser;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Reads {@link PersistedAuthority} objects from the
* {@link org.devgateway.eudevfin.auth.common.domain.PersistedUser#getPersistedAuthorities()}
* and also from the {@link PersistedUserGroup#getPersistedAuthorities()}
* (only if the {@link User} belongs to only one {@link PersistedUserGroup})
* and converts all {@link PersistedAuthority} objects to
* {@link GrantedAuthority}.
*
* @param domainUser
* @return a {@link Set} containing the {@link GrantedAuthority}S
*/
public static Set<GrantedAuthority> getGrantedAuthorities(final Person domainUser) {
Set<GrantedAuthority> grantedAuth = new HashSet<GrantedAuthority>();
// get user authorities
for (Role authority : domainUser.getRoles()) {
grantedAuth.add(new SimpleGrantedAuthority(authority.getAuthority()));
}
return grantedAuth;
}
}