2016-11-22 2 views
0

Je développe une application mobile hybride et ai implémenté une API de repos basée sur java basée sur spring mvc et hibernate. J'utilise MySql comme base de données. Pour l'authentification, j'ai implémenté Oauth2.0.base de données multitable avec spring mvc, hibernate et Oauth2

Actuellement, j'ai un seul client, donc j'ai utilisé une seule source de données. mais mon exigence a changé j'ai 5 clients chacun ayant min 1000 utilisateurs. donc décidé d'utiliser le schéma de base de données séparée multi-tenancy. mais il y a quelques utilisateurs pour lesquels j'ai besoin d'aller chercher des données de tous les locataires ou en combinaison de locataires et après quelques calculs afficher leur résultat dans le tableau de bord.

et je veux également implémenter une couche supplémentaire de file d'attente spécifique de client hébergé séparée qui contient une requête spécifique de client hébergé.

Comment puis-je faire cela?

+0

s'il vous plaît poster une ligne de code (classe Java, fichier de propriétés, ...) – emoleumassi

+0

est-il que la base de données qui est mutualisée ou est-ce aussi l'application, ou vous avez 5 cas de l'application (éventuellement sur le même conteneur Web)? –

+0

ils sont des écoles différentes du même groupe, donc j'ai décidé de fournir la même application mais garder les données dans une base de données séparée, mais une gestion plus élevée ayant accès à tous les dbs. –

Répondre

0

J'ai implémenté quelque chose comme ça auparavant, en utilisant EclipseLink et en supportant MySQL (et 6 autres SGBD). Dans ce cas, l'application était utilisée dans une entreprise, mais vous pouviez avoir plusieurs projets isolant différents départements (locataires) et vous pouviez définir des utilisateurs pouvant voir les données de tous les projets.

La clé est d'introduire une entité locataire en tant qu'entité de niveau supérieur dans votre diagramme ER, chaque autre entité appartient à un locataire.

@Entity 
public class Tenant { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToMany(mappedBy = "tenant", cascade = CascadeType.ALL) 
    private Collection<User> users; 

    @OneToMany(mappedBy = "tenant", cascade = CascadeType.ALL) 
    private Collection<TenantConfiguration> configurations; 
} 

Un défi que vous devrez faire face est la sécurité. À chaque demande, vous devez vérifier si l'utilisateur a l'autorisation d'accéder aux entités demandées (ne faites jamais confiance au serveur frontal). Cela signifie que l'authentification OAuth2 (créée lors de la connexion) doit contenir une référence à une entité qui vous permet de déterminer la location et les autorisations des utilisateurs. Pour des raisons de performances, vous incluez généralement le Tenancy (TENANCY_ID) dans les requêtes JPA pour éviter de charger beaucoup de données et de les filtrer en mémoire.

Bonne chance

+0

pour implémenter cela j'ai besoin de construire une base de données centrale contient des informations de connexion ainsi que des informations de jeton d'authentification? –

+0

Klaus Groenbaek: J'ai implémenté ceci mais le problème est quand j'implémente pour la gestion [avoir le rôle multiple dans le locataire multiple], je dois chercher des données selon leur rôle du locataire correspondant et effectuer quelques opérations. –