]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
b8faec5551de65ffa402d282dfe9c34bb9ccbd71
[tmp/jakarta-migration.git] /
1 package org.collectionspace.authentication;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7
8 import javax.security.auth.login.AccountException;
9 import javax.security.auth.login.AccountNotFoundException;
10
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;
16
17 public class CSpaceAuthenticationSuccessEvent implements ApplicationListener<AuthenticationSuccessEvent> {
18         
19         final private static String UPDATE_USER_SQL =
20                         "UPDATE users SET lastlogin = now() WHERE username = ?";
21
22         @Override
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();
28                 
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();
34                                 try {
35                                         setLastLogin(cspaceDbRealm, username);
36                                 } catch (Exception e) {
37                                         // TODO Auto-generated catch block
38                                         e.printStackTrace();
39                                 }
40                         }
41                 }
42         }
43         
44         private void setLastLogin(CSpaceDbRealm cspaceDbRealm, String username) throws AccountException {
45         Connection conn = null;
46         PreparedStatement ps = null;
47         ResultSet rs = null;
48         
49         try {
50             conn = cspaceDbRealm.getConnection();
51             ps = conn.prepareStatement(UPDATE_USER_SQL);
52             ps.setString(1, username);
53             int affected = ps.executeUpdate();
54             if (affected < 1) {
55                 String errMsg = String.format("No matching username '%s' found.", username);
56                 throw new AccountException(errMsg);
57             }
58         } catch (SQLException ex) {
59                 // Assuming PostgreSQL
60             if (PSQLState.UNDEFINED_COLUMN.getState().equals(ex.getSQLState())) {
61                 System.err.println("'users' table is missing 'lastlogin' column.");
62             } else {
63                 AccountException ae = new AccountException("Authentication query failed: " + ex.getLocalizedMessage());
64                 ae.initCause(ex);
65                 throw ae;
66             }
67         } catch (AccountNotFoundException ex) {
68             throw ex;
69         } catch (Exception ex) {
70             AccountException ae = new AccountException("Unknown Exception");
71             ae.initCause(ex);
72             throw ae;
73         } finally {
74             if (rs != null) {
75                 try {
76                     rs.close();
77                 } catch (SQLException e) {
78                 }
79             }
80             if (ps != null) {
81                 try {
82                     ps.close();
83                 } catch (SQLException e) {
84                 }
85             }
86             if (conn != null) {
87                 try {
88                     conn.close();
89                 } catch (SQLException ex) {
90                 }
91             }
92         }
93     }
94 }