View Javadoc

1   /**
2    * 
3    */
4   package de.tivsource.page.reservation.security;
5   
6   
7   import java.io.IOException;
8   import java.util.List;
9   import java.util.Map;
10  
11  import javax.naming.Context;
12  import javax.naming.InitialContext;
13  import javax.naming.NamingException;
14  import javax.security.auth.Subject;
15  import javax.security.auth.callback.Callback;
16  import javax.security.auth.callback.CallbackHandler;
17  import javax.security.auth.callback.NameCallback;
18  import javax.security.auth.callback.PasswordCallback;
19  import javax.security.auth.callback.UnsupportedCallbackException;
20  import javax.security.auth.login.LoginException;
21  import javax.security.auth.spi.LoginModule;
22  
23  import de.tivsource.page.dao.administration.UserDaoLocal;
24  import de.tivsource.page.entity.administration.Role;
25  import de.tivsource.page.entity.administration.User;
26  
27  /**
28   * @author Marc Michele
29   *
30   */
31  public class AdminLoginModule implements LoginModule {
32  
33  	private CallbackHandler handler;
34  	private Subject subject;
35  	private User userPrincipal;
36  	private List<Role> rolePrincipals;
37  	
38  	@Override
39  	public void initialize(Subject subject, CallbackHandler callbackHandler,
40  			Map<String, ?> sharedState, Map<String, ?> options) {
41  		handler = callbackHandler;
42  		this.subject = subject;
43  	}// Ende initialize()
44  
45  	@Override
46  	public boolean login() throws LoginException {
47  	    Callback[] callbacks = new Callback[2];
48  	    callbacks[0] = new NameCallback("login");
49  	    callbacks[1] = new PasswordCallback("password", true);
50  
51  
52  	    try {
53  	      handler.handle(callbacks);
54  	      String name = ((NameCallback) callbacks[0]).getName();
55  	      String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());
56  
57  	      // Überprüfen ob der Name und
58  	      // das Passwort gesetzt wurden
59  	      if (name != null &&
60  	          password != null) {
61  
62  	    	  Context initialContext = new InitialContext();
63  	    	  UserDaoLocal userDaoLocal = (UserDaoLocal) initialContext.lookup("java:global/tiv-page/dao-0.0.1/UserDao");
64  	    	  
65  	    	  // Versuche benutzer mit dem Namen aus der Datenbank zu holen.
66  	    	  User dbUser = userDaoLocal.findByUsername(name);
67  
68  	    	  // Überprüfen ob ein Benutzer gefunden wurde
69  	    	  // und ob die Daten stimmen.
70  	    	  if(dbUser != null &&
71  	    	     name.equals(dbUser.getName()) && 
72  	    	     password.equals(dbUser.getPassword())) {
73  	  	        userPrincipal = dbUser;
74  		        return true;
75  	    	  }// Ende if
76  
77  	      }// Ende if
78  
79  	      // If credentials are NOT OK we throw a LoginException
80  	      throw new LoginException("Authentication failed");
81  
82  	    } catch (IOException e) {
83  	      throw new LoginException(e.getMessage());
84  	    } catch (UnsupportedCallbackException e) {
85  	      throw new LoginException(e.getMessage());
86  	    } catch (NamingException e) {
87  	      throw new LoginException(e.getMessage());
88  		}
89  	}
90  
91  	@Override
92  	public boolean commit() throws LoginException {
93  	    subject.getPrincipals().add(userPrincipal);
94  	    rolePrincipals = userPrincipal.getRoles();
95  
96  	    for (Role roleName : rolePrincipals) {
97  	    	subject.getPrincipals().add(roleName);
98  	    }
99  	    return true;
100 	}
101 
102 	@Override
103 	public boolean abort() throws LoginException {
104 		return false;
105 	}
106 
107 	@Override
108 	public boolean logout() throws LoginException {
109 		subject.getPrincipals().remove(userPrincipal);
110 	    subject.getPrincipals().remove(rolePrincipals);
111 	    return true;
112 	}
113 
114 }// Ende class