/**
* Copyright 2010 the original author or authors.
*
* This file is part of Zksample2. http://zksample2.sourceforge.net/
*
* Zksample2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Zksample2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Zksample2. If not, see <http://www.gnu.org/licenses/gpl.html>.
*/
package de.forsthaus.policy.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.log4j.Logger;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import de.forsthaus.backend.model.SecRight;
import de.forsthaus.backend.model.SecUser;
import de.forsthaus.backend.service.UserService;
/**
* This class implements the spring-security UserDetailService Interface.<br>
* It's been configured in the 'springSecurityContext.xml'.<br>
*
* @author bbruhns
* @author Stephan Gerth
* @see de.forsthaus.policy
*/
public class PolicyManager implements UserDetailsService, Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(PolicyManager.class);
// the service from which we get the data
private transient UserService userService;
@Override
public UserDetails loadUserByUsername(String userId) {
SecUser user = null;
Collection<GrantedAuthority> grantedAuthorities = null;
try {
user = getUserByLoginname(userId);
if (user == null) {
throw new UsernameNotFoundException("Invalid User");
}
grantedAuthorities = getGrantedAuthority(user);
} catch (final NumberFormatException e) {
throw new DataRetrievalFailureException("Cannot loadUserByUsername userId:" + userId + " Exception:" + e.getMessage(), e);
}
// Create the UserDetails object for a specified user with
// their grantedAuthorities List.
final UserDetails userDetails = new UserImpl(user, grantedAuthorities);
if (logger.isDebugEnabled()) {
logger.debug("Rights for '" + user.getUsrLoginname() + "' (ID: " + user.getId() + ") evaluated. [" + this + "]");
}
return userDetails;
}
/**
* Gets the User object by his stored userName.<br>
*
* @param userName
* @return
*/
public SecUser getUserByLoginname(final String userName) {
return getUserService().getUserByLoginname(userName);
}
/**
* Fills the GrantedAuthorities List for a specified user.<br>
* 1. Gets a unique list of rights that a user have.<br>
* 2. Creates GrantedAuthority objects from all rights. <br>
* 3. Creates a GrantedAuthorities list from all GrantedAuthority objects.<br>
*
* @param user
* @return
*/
private Collection<GrantedAuthority> getGrantedAuthority(SecUser user) {
// get the list of rights for a specified user from db.
final Collection<SecRight> rights = getUserService().getRightsByUser(user);
// create the list for the spring grantedRights
final ArrayList<GrantedAuthority> rightsGrantedAuthorities = new ArrayList<GrantedAuthority>(rights.size());
// now create for all rights a GrantedAuthority entry
// and fill the GrantedAuthority List with these authorities.
for (final SecRight right : rights) {
rightsGrantedAuthorities.add(new GrantedAuthorityImpl(right.getRigName()));
}
return rightsGrantedAuthorities;
}
// +++++++++++++++++++++++++++++++++++++++++++++++++ //
// ++++++++++++++++ Setter/Getter ++++++++++++++++++ //
// +++++++++++++++++++++++++++++++++++++++++++++++++ //
public UserService getUserService() {
return this.userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}