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
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 }
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
58
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
66 User dbUser = userDaoLocal.findByUsername(name);
67
68
69
70 if(dbUser != null &&
71 name.equals(dbUser.getName()) &&
72 password.equals(dbUser.getPassword())) {
73 userPrincipal = dbUser;
74 return true;
75 }
76
77 }
78
79
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 }