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.core.Authentication;
17 public class CSpaceAuthenticationSuccessEvent implements ApplicationListener<AuthenticationSuccessEvent> {
19 private static final String UPDATE_USER_SQL =
20 "UPDATE users SET lastlogin = now() WHERE username = ?";
23 public void onApplicationEvent(AuthenticationSuccessEvent event) {
24 if (event.getSource() instanceof Authentication) {
25 Authentication eventSource = (Authentication) event.getSource();
27 if (eventSource.getPrincipal() instanceof CSpaceUser) {
28 CSpaceDbRealm cspaceDbRealm = new CSpaceDbRealm();
29 CSpaceUser cspaceUser = (CSpaceUser) eventSource.getPrincipal();
30 String username = cspaceUser.getUsername();
33 setLastLogin(cspaceDbRealm, username);
34 } catch (Exception e) {
41 private void setLastLogin(CSpaceDbRealm cspaceDbRealm, String username) throws AccountException {
42 Connection conn = null;
43 PreparedStatement ps = null;
47 conn = cspaceDbRealm.getConnection();
48 ps = conn.prepareStatement(UPDATE_USER_SQL);
49 ps.setString(1, username);
50 int affected = ps.executeUpdate();
52 String errMsg = String.format("No matching username '%s' found.", username);
53 throw new AccountException(errMsg);
55 } catch (SQLException ex) {
56 // Assuming PostgreSQL
57 if (PSQLState.UNDEFINED_COLUMN.getState().equals(ex.getSQLState())) {
58 System.err.println("'users' table is missing 'lastlogin' column.");
60 AccountException ae = new AccountException("Authentication query failed: " + ex.getLocalizedMessage());
64 } catch (AccountNotFoundException ex) {
66 } catch (Exception ex) {
67 AccountException ae = new AccountException("Unknown Exception");
74 } catch (SQLException e) {
80 } catch (SQLException e) {
86 } catch (SQLException ex) {