package info.ozkan.vipera.business.login;
import info.ozkan.vipera.business.role.Role;
import info.ozkan.vipera.dao.login.PatientLoginDao;
import info.ozkan.vipera.entities.Patient;
import java.util.Collection;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
/**
* Hasta yetkilendirme yöneticisi
*
* @author Ömer Özkan
*
*/
@Named("patientLoginManager")
public class PatientLoginManager implements AuthenticationProvider {
/**
* veri katmanı
*/
@Inject
private PatientLoginDao patientLoginDao;
/**
* Login işlemini gerçekleştirir
*/
public Authentication authenticate(final Authentication authentication) {
final Authentication authToken;
final PatientLoginResult result = getLoginResult(authentication);
final PatientLoginStatus status = result.getStatus();
if (status.equals(PatientLoginStatus.SUCCESS)) {
authToken = createToken(result);
} else if (status.equals(PatientLoginStatus.INVALID_USERNAME)) {
throw new UsernameNotFoundException("Patient not found: "
+ authentication.getPrincipal());
} else {
throw new BadCredentialsException("Invalid password");
}
return authToken;
}
/**
* Giriş başarılı olduğu durumda token nesnesi üretir
*
* @param result
* @return
*/
private UsernamePasswordAuthenticationToken createToken(
final PatientLoginResult result) {
final Collection<? extends GrantedAuthority> authorities =
AuthorityUtils.createAuthorityList(Role.ROLE_PATIENT);
final Patient patient = result.getPatient();
final String patientPassword = patient.getPassword();
final UsernamePasswordAuthenticationToken token =
new UsernamePasswordAuthenticationToken(patient,
patientPassword, authorities);
return token;
}
/**
* Kullanıcının girdiği tckn ve parolayı sistemden sorgular
*
* @param authentication
* @return
*/
private PatientLoginResult getLoginResult(
final Authentication authentication) {
final Long tckn = (Long) authentication.getPrincipal();
final String password = authentication.getCredentials().toString();
return patientLoginDao.find(tckn, password);
}
public boolean supports(final Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}