package tudu.security;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.security.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tudu.domain.model.Role;
import tudu.domain.model.User;
import tudu.service.UserManager;
import java.util.Calendar;
import java.util.Set;
/**
* An implementation of Spring Security's UserDetailsService.
*
* @author Julien Dubois
*/
@Service("userDetailsService")
@Transactional
public class UserDetailsServiceImpl implements UserDetailsService {
private final Log log = LogFactory.getLog(UserDetailsServiceImpl.class);
@Autowired
private UserManager userManager;
/**
* Load a user for Spring Security.
*/
@Transactional(propagation = Propagation.REQUIRED)
public UserDetails loadUserByUsername(String login)
throws UsernameNotFoundException, DataAccessException {
login = login.toLowerCase();
if (log.isDebugEnabled()) {
log.debug("Security verification for user '" + login + "'");
}
User user = null;
try {
user = userManager.findUser(login);
} catch (ObjectRetrievalFailureException orfe) {
throw new UsernameNotFoundException("User '" + login
+ "' could not be found.");
}
user.setLastAccessDate(Calendar.getInstance().getTime());
userManager.updateUser(user);
Set<Role> roles = user.getRoles();
GrantedAuthority[] arrayAuths = new GrantedAuthority[roles.size()];
int index = 0;
for (Role role : roles) {
arrayAuths[index++] = new GrantedAuthorityImpl(role.getRole());
}
return new org.springframework.security.userdetails.User(login,
user.getPassword(), user.isEnabled(), true, true, true,
arrayAuths);
}
}