| 1 |
|
package org.trails.security; |
| 2 |
|
|
| 3 |
|
import java.util.Date; |
| 4 |
|
import java.util.List; |
| 5 |
|
|
| 6 |
|
import org.acegisecurity.Authentication; |
| 7 |
|
import org.acegisecurity.AuthenticationException; |
| 8 |
|
import org.acegisecurity.BadCredentialsException; |
| 9 |
|
import org.acegisecurity.providers.AuthenticationProvider; |
| 10 |
|
import org.acegisecurity.userdetails.UserDetails; |
| 11 |
|
import org.acegisecurity.userdetails.UserDetailsService; |
| 12 |
|
import org.apache.log4j.Logger; |
| 13 |
|
import org.hibernate.criterion.DetachedCriteria; |
| 14 |
|
import org.hibernate.criterion.Restrictions; |
| 15 |
|
import org.trails.persistence.HibernatePersistenceService; |
| 16 |
|
|
| 17 |
3 |
public class ExpiringKeyAuthenticationProvider implements AuthenticationProvider { |
| 18 |
3 |
private static final Logger log = Logger.getLogger(ExpiringKeyAuthenticationProvider.class); |
| 19 |
|
|
| 20 |
|
private HibernatePersistenceService persistenceService; |
| 21 |
|
private UserDetailsService userDetailsService; |
| 22 |
|
|
| 23 |
|
public void setPersistenceService(HibernatePersistenceService persistenceService) { |
| 24 |
3 |
this.persistenceService = persistenceService; |
| 25 |
3 |
} |
| 26 |
|
|
| 27 |
|
public void setUserDetailsService(UserDetailsService userDetailsService) { |
| 28 |
3 |
this.userDetailsService = userDetailsService; |
| 29 |
3 |
} |
| 30 |
|
|
| 31 |
|
public Authentication authenticate(Authentication authentication) throws AuthenticationException { |
| 32 |
|
|
| 33 |
|
|
| 34 |
3 |
if (authentication.getAuthorities() != null) return authentication; |
| 35 |
|
|
| 36 |
3 |
if (authentication.getPrincipal() == null) return authentication; |
| 37 |
3 |
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(ExpiringKey.class); |
| 38 |
3 |
detachedCriteria.add(Restrictions.eq("name", authentication.getName()) ); |
| 39 |
3 |
detachedCriteria.add(Restrictions.gt("expiresAfter", new Date() ) ); |
| 40 |
|
|
| 41 |
3 |
List<ExpiringKey> expiringKeys = persistenceService.getInstances(ExpiringKey.class, detachedCriteria ); |
| 42 |
3 |
if (expiringKeys.size() <= 0) throw new BadCredentialsException("No persistent credentials found"); |
| 43 |
|
|
| 44 |
|
|
| 45 |
3 |
String providedToken = authentication.getCredentials().toString(); |
| 46 |
3 |
if (providedToken == null) throw new BadCredentialsException("No remember me token provided"); |
| 47 |
|
|
| 48 |
3 |
for (ExpiringKey key : expiringKeys) if (providedToken.equals(key.getValue()) ) { |
| 49 |
3 |
UserDetails userDetails = userDetailsService.loadUserByUsername(key.getName()); |
| 50 |
|
|
| 51 |
|
|
| 52 |
|
|
| 53 |
3 |
if (userDetails == null) throw new BadCredentialsException("Token found, but user doesn't exist"); |
| 54 |
3 |
log.info("Successfully authenticated user " + authentication.getName() + " using expiring key"); |
| 55 |
3 |
return new UserKeyAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), userDetails.getAuthorities() ); |
| 56 |
|
} |
| 57 |
0 |
throw new BadCredentialsException("No matching token available"); |
| 58 |
|
} |
| 59 |
|
|
| 60 |
|
public boolean supports(Class authenticationClass) { |
| 61 |
0 |
return (UserKeyAuthenticationToken.class.isAssignableFrom(authenticationClass)); |
| 62 |
|
} |
| 63 |
|
} |