From 602c4c4501dcd89cbce1d6ba61ba6bc75761d643 Mon Sep 17 00:00:00 2001
From: Roberto Sánchez <roberto.sanchez@curisit.net>
Date: Sat, 18 Jan 2014 11:23:45 +0000
Subject: [PATCH] #396 feature - Getting all orgs from user including the children ones
---
securis/src/main/java/net/curisit/securis/services/SecurityInterceptor.java | 21 +++++++++++++++++++++
securis/src/main/java/net/curisit/securis/db/User.java | 26 ++++++++++++++++++++++----
securis/src/main/java/net/curisit/securis/services/UserResource.java | 11 ++++++-----
3 files changed, 49 insertions(+), 9 deletions(-)
diff --git a/securis/src/main/java/net/curisit/securis/db/User.java b/securis/src/main/java/net/curisit/securis/db/User.java
index 1de7b9f..7f57cf8 100644
--- a/securis/src/main/java/net/curisit/securis/db/User.java
+++ b/securis/src/main/java/net/curisit/securis/db/User.java
@@ -3,7 +3,9 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
@@ -70,7 +72,7 @@
inverseJoinColumns =
{ @JoinColumn(name = "organization_id", referencedColumnName = "id") } //
)
- private List<Organization> organizations;
+ private Set<Organization> organizations;
public String getUsername() {
return username;
@@ -160,17 +162,17 @@
this.lang = lang;
}
- public List<Organization> getOrganizations() {
+ public Set<Organization> getOrganizations() {
return organizations;
}
- public void setOrganizations(List<Organization> organizations) {
+ public void setOrganizations(Set<Organization> organizations) {
this.organizations = organizations;
}
@JsonProperty("organizations_ids")
public void setOrgsIds(List<Integer> orgsIds) {
- organizations = new ArrayList<>();
+ organizations = new HashSet<>();
for (Integer orgid : orgsIds) {
Organization o = new Organization();
o.setId(orgid);
@@ -189,6 +191,22 @@
return ids;
}
+ @JsonIgnore
+ public Set<Integer> getAllOrgsIds() {
+ if (organizations == null)
+ return null;
+ Set<Integer> ids = new HashSet<>();
+ includeAllOrgs(this.organizations, ids);
+ return ids;
+ }
+
+ private void includeAllOrgs(Set<Organization> list, Set<Integer> orgIds) {
+ for (Organization org : list) {
+ orgIds.add(org.getId());
+ includeAllOrgs(org.getChildOrganizations(), orgIds);
+ }
+ }
+
static public class Rol {
static public final int ADVANCE = 0x01;
static public final int ADMIN = 0x02;
diff --git a/securis/src/main/java/net/curisit/securis/services/SecurityInterceptor.java b/securis/src/main/java/net/curisit/securis/services/SecurityInterceptor.java
index ca84402..08c4e2e 100644
--- a/securis/src/main/java/net/curisit/securis/services/SecurityInterceptor.java
+++ b/securis/src/main/java/net/curisit/securis/services/SecurityInterceptor.java
@@ -3,6 +3,7 @@
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
+import java.util.Set;
import javax.inject.Inject;
import javax.persistence.EntityManager;
@@ -60,8 +61,27 @@
log.info("User {} has no necessary role to access url: {}", username, servletRequest.getPathInfo());
containerRequestContext.abortWith(Response.status(Status.UNAUTHORIZED).build());
}
+ Set<Integer> orgs = getUserOrganizations(username);
+ servletRequest.setAttribute("user_orgs", orgs);
}
}
+ }
+
+ private Set<Integer> getUserOrganizations(String username) {
+ @SuppressWarnings("unchecked")
+ Set<Integer> userOrgs = cache.get("orgs_" + username, Set.class);
+ if (userOrgs == null) {
+ // Theorically this shouldn't be never null, but just in case...
+ EntityManager em = emProvider.get();
+ User user = em.find(User.class, username);
+ if (user != null) {
+ userOrgs = user.getAllOrgsIds();
+ // We store user orgs in cache only for one hour
+ cache.set("orgs_" + username, userOrgs, 3600);
+ }
+ }
+
+ return userOrgs;
}
private int getUserRoles(String username) {
@@ -79,6 +99,7 @@
}
// We store user roles in cache only for one hour
cache.set("roles_" + username, userRoles, 3600);
+ cache.set("orgs_" + username, user.getOrgsIds(), 3600);
}
}
return userRoles == null ? 0 : userRoles.intValue();
diff --git a/securis/src/main/java/net/curisit/securis/services/UserResource.java b/securis/src/main/java/net/curisit/securis/services/UserResource.java
index 2bc90ee..014ce20 100644
--- a/securis/src/main/java/net/curisit/securis/services/UserResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/UserResource.java
@@ -1,8 +1,9 @@
package net.curisit.securis.services;
-import java.util.ArrayList;
import java.util.Date;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.inject.Inject;
import javax.inject.Provider;
@@ -113,10 +114,10 @@
return modify(user, user.getUsername(), token);
}
- List<Organization> orgs = null;
+ Set<Organization> orgs = null;
List<Integer> orgsIds = user.getOrgsIds();
if (orgsIds != null && orgsIds.size() > 0) {
- orgs = new ArrayList<>();
+ orgs = new HashSet<>();
for (Integer orgId : orgsIds) {
Organization o = em.find(Organization.class, orgId);
if (o == null) {
@@ -152,10 +153,10 @@
return create(user, token);
}
- List<Organization> orgs = null;
+ Set<Organization> orgs = null;
List<Integer> orgsIds = user.getOrgsIds();
if (orgsIds != null && orgsIds.size() > 0) {
- orgs = new ArrayList<>();
+ orgs = new HashSet<>();
for (Integer orgId : orgsIds) {
Organization o = em.find(Organization.class, orgId);
if (o == null) {
--
Gitblit v1.3.2