1 package org.collectionspace.authentication;
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
8 import javax.security.auth.login.AccountException;
9 import javax.security.auth.login.AccountNotFoundException;
11 import org.collectionspace.authentication.realm.db.CSpaceDbRealm;
12 import org.postgresql.util.PSQLState;
13 import org.springframework.context.ApplicationListener;
14 import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
15 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
17 public class CSpaceAuthenticationSuccessEvent implements ApplicationListener<AuthenticationSuccessEvent> {
19 final private static String UPDATE_USER_SQL =
20 "UPDATE users SET lastlogin = now() WHERE username = ?";
23 public void onApplicationEvent(AuthenticationSuccessEvent event) {
24 // TODO Auto-generated method stub
25 System.out.println(); //org.springframework.security.authentication.UsernamePasswordAuthenticationToken@8a633e91: Principal: org.collectionspace.authentication.CSpaceUser@b122ec20: Username: admin@core.collectionspace.org; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_1_TENANT_ADMINISTRATOR,ROLE_SPRING_ADMIN; Credentials: [PROTECTED]; Authenticated: true; Details: {grant_type=password, username=admin@core.collectionspace.org}; Granted Authorities: ROLE_1_TENANT_ADMINISTRATOR, ROLE_SPRING_ADMIN
26 String userName = null;
27 CSpaceDbRealm cspaceDbRealm = new CSpaceDbRealm();
29 if (event.getSource() instanceof UsernamePasswordAuthenticationToken) {
30 UsernamePasswordAuthenticationToken eventSource = (UsernamePasswordAuthenticationToken)event.getSource();
31 if (eventSource.getPrincipal() instanceof CSpaceUser) {
32 CSpaceUser cspaceUser = (CSpaceUser) eventSource.getPrincipal();
33 userName = cspaceUser.getUsername();
35 setLastLogin(cspaceDbRealm, userName);
36 } catch (Exception e) {
37 // TODO Auto-generated catch block
45 private void setLastLogin(CSpaceDbRealm cspaceDbRealm, String username) throws AccountException {
46 Connection conn = null;
47 PreparedStatement ps = null;
50 conn = cspaceDbRealm.getConnection();
53 ps = conn.prepareStatement(UPDATE_USER_SQL);
54 ps.setString(1, username);
55 rs = ps.executeQuery();
56 if (rs.next() == false) {
57 throw new AccountNotFoundException("No matching username found");
59 } catch (SQLException ex) {
60 // Assuming PostgreSQL
61 if (PSQLState.UNDEFINED_COLUMN.getState().equals(ex.getSQLState())) {
62 System.err.println("'USERS' table is missing 'lastlogin' column.");
64 AccountException ae = new AccountException("Authentication query failed: " + ex.getLocalizedMessage());
68 } catch (AccountNotFoundException ex) {
70 } catch (Exception ex) {
71 AccountException ae = new AccountException("Unknown Exception");
78 } catch (SQLException e) {
84 } catch (SQLException e) {
90 } catch (SQLException ex) {