rsanchez
2015-01-28 09f0f86d50933ea11eb3315e5728718e23d37dcf
securis/src/main/java/net/curisit/securis/security/SecurityInterceptor.java
similarity index 64%rename from securis/src/main/java/net/curisit/securis/security/SecurityInterceptor.javarename to securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
....@@ -1,4 +1,4 @@
1
-package net.curisit.securis.security;
1
+package net.curisit.securis.ioc;
22
33 import java.io.IOException;
44 import java.lang.reflect.Method;
....@@ -12,12 +12,17 @@
1212 import javax.ws.rs.Priorities;
1313 import javax.ws.rs.WebApplicationException;
1414 import javax.ws.rs.container.ContainerRequestContext;
15
+import javax.ws.rs.container.ContainerRequestFilter;
16
+import javax.ws.rs.container.ContainerResponseContext;
17
+import javax.ws.rs.container.ContainerResponseFilter;
1518 import javax.ws.rs.core.Context;
1619 import javax.ws.rs.core.Response;
1720 import javax.ws.rs.core.Response.Status;
1821 import javax.ws.rs.ext.Provider;
1922
2023 import net.curisit.securis.db.User;
24
+import net.curisit.securis.security.BasicSecurityContext;
25
+import net.curisit.securis.security.Securable;
2126 import net.curisit.securis.utils.CacheTTL;
2227 import net.curisit.securis.utils.TokenHelper;
2328
....@@ -32,8 +37,8 @@
3237
3338 @Provider
3439 @Priority(Priorities.AUTHENTICATION)
35
-public class SecurityInterceptor implements javax.ws.rs.container.ContainerRequestFilter {
36
- private static final Logger LOG = LogManager.getLogger(SecurityInterceptor.class);
40
+public class RequestsInterceptor implements ContainerRequestFilter, ContainerResponseFilter {
41
+ private static final Logger LOG = LogManager.getLogger(RequestsInterceptor.class);
3742
3843 @Context
3944 private HttpServletRequest servletRequest;
....@@ -48,23 +53,43 @@
4853 private Dispatcher dispatcher;
4954
5055 @Inject
51
- private EntityManager em;
56
+ private EntityManagerProvider emProvider;
5257
5358 public void filter(ContainerRequestContext containerRequestContext) throws IOException {
59
+ EntityManager em = emProvider.getEntityManager();
60
+ ResteasyProviderFactory.pushContext(EntityManager.class, em);
5461
5562 ResourceMethodInvoker methodInvoker = (ResourceMethodInvoker) containerRequestContext
5663 .getProperty("org.jboss.resteasy.core.ResourceMethodInvoker");
5764 Method method = methodInvoker.getMethod();
5865
66
+ LOG.info("Stored in context, em: {}, {}?", em, method.toGenericString());
67
+
68
+ boolean next = checkSecurableMethods(containerRequestContext, method);
69
+ if (next) {
70
+ prepareTransaction(containerRequestContext, method);
71
+ }
72
+ }
73
+
74
+ private void prepareTransaction(ContainerRequestContext containerRequestContext, Method method) {
75
+ EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
76
+
77
+ if (method.isAnnotationPresent(EnsureTransaction.class)) {
78
+ LOG.info("WE need transaction!!!");
79
+ em.getTransaction().begin();
80
+ }
81
+ }
82
+
83
+ private boolean checkSecurableMethods(ContainerRequestContext containerRequestContext, Method method) {
5984 if (!method.isAnnotationPresent(Securable.class)) {
60
- return;
85
+ return true;
6186 }
6287 String token = servletRequest.getHeader(TokenHelper.TOKEN_HEADER_PĂ€RAM);
6388 if (token == null || !tokenHelper.isTokenValid(token)) {
6489 LOG.info("Access denied to '{}', Token not valid.", servletRequest.getPathInfo());
6590 containerRequestContext.abortWith(Response.status(Status.UNAUTHORIZED).build());
91
+ return false;
6692 } else {
67
- Securable sec = method.getAnnotation(Securable.class);
6893
6994 // If roles == 0 we only need to validate the token
7095 String username = tokenHelper.extractUserFromToken(token);
....@@ -76,15 +101,18 @@
76101 containerRequestContext.setSecurityContext(scw);
77102 // Next line provide injection in resource methods
78103 ResteasyProviderFactory.pushContext(BasicSecurityContext.class, scw);
79
- ResteasyProviderFactory.pushContext(EntityManager.class, em);
80104 LOG.debug("Added custom SecurityContext for user {}, orgs: {}", username, orgs);
81105 }
106
+ return true;
107
+
82108 }
83109
84110 private Set<Integer> getUserOrganizations(String username) {
85111 @SuppressWarnings("unchecked")
86112 Set<Integer> userOrgs = cache.get("orgs_" + username, Set.class);
87113 if (userOrgs == null) {
114
+ EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
115
+
88116 // Theorically this shouldn't be never null, but just in case...
89117 User user = em.find(User.class, username);
90118 if (user != null) {
....@@ -103,6 +131,8 @@
103131 }
104132 Integer userRoles = cache.get("roles_" + username, Integer.class);
105133 if (userRoles == null) {
134
+ EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
135
+
106136 User user = em.find(User.class, username);
107137 if (user != null) {
108138 userRoles = 0;
....@@ -123,4 +153,23 @@
123153 return null;
124154 }
125155
156
+ @Override
157
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
158
+ EntityManager em = ResteasyProviderFactory.getContextData(EntityManager.class);
159
+
160
+ if (em != null && em.getTransaction().isActive()) {
161
+ LOG.info("There is transaction go ahead...");
162
+ if (responseContext.getStatus() == Status.OK.getStatusCode()) {
163
+ em.getTransaction().commit();
164
+ LOG.info("COMMIT");
165
+ } else {
166
+ em.getTransaction().rollback();
167
+ LOG.info("ROLLBACK");
168
+ }
169
+ } else {
170
+ LOG.info("There is NO transaction");
171
+
172
+ }
173
+ }
174
+
126175 }