2008-10-08 21 views
3

J'ai un client Java qui a besoin d'accéder à une base de données distante. L'objectif est de masquer les informations d'identification de la base de données de l'utilisateur et de ne pas coder les informations d'identification dans le code. Par conséquent, l'accès à la base de données devra probablement être du côté serveur.Client JAVA Swing, accès aux données à la base de données distante; Ibatis

Je suis limité à utiliser Ibatis comme cadre d'abstraction de données. En dehors de cela, JBoss fonctionne sur le serveur web, ce qui me permet d'utiliser des sources de données.

Comment concevez-vous l'accès à la base de données distante et la sérialisation/désérialisation des données. préférez-vous les services Web d'une sorte de flux de données sur une socket? Comment auriez-vous réalisé l'un ou l'autre des deux?

Répondre

3

Construire une couche de service et l'exposer sur RMI - éventuellement en tant que beans de session sans état EJB3 comme vous avez JBoss, éventuellement en tant que RMI pur. Je ne voudrais pas déranger avec les services Web, sauf si vous avez un besoin spécifique. RMI prendra en charge la sérialisation pour vous.

Votre couche de service doit exposer une méthode pour authentifier les utilisateurs en utilisant leurs informations d'identification entrées au démarrage de l'application Swing. Tous les appels de données passent par la couche de service. Aucun SQL n'existe dans l'application Swing.

Il existe d'autres avantages de cet arrangement autre que le simple fait de cacher les informations d'identification de la base de données. Non seulement vous vous retrouvez avec une architecture en couches, mais vous gagnez en efficacité en partageant des instructions préparées entre tous vos clients en ayant une seule source de données sur le serveur.

0

Vous voulez donc que les utilisateurs puissent accéder à la base de données sans connaître les informations d'identification? Votre seule option est l'accès à la base de données côté serveur. Malheureusement, il n'y a aucun moyen de masquer le nom d'utilisateur et le mot de passe en Java - si vous le placez dans un fichier de propriétés et le cryptez, un attaquant peut toujours attacher un débogueur et voir quelles valeurs sont conservées dans votre code. De plus, à moins que vous ne vous connectiez à la base de données via une connexion sécurisée, quelqu'un pourrait exécuter un renifleur de paquets tel que tcpdump et obtenir les informations d'identification à cet endroit. Vous dites que vous utilisez un serveur JBoss, le mieux étant de configurer des EJB distants pour que votre application client n'accède pas directement à la base de données - elle doit passer par vos méthodes EJB. (Il ne doit pas être EJB, en passant, vous pouvez faire quelque chose comme des services Web si vous préférez). Le point est que votre serveur communique directement avec les databas et que le seul accès de votre client se fait via un ensemble limité d'interfaces que vous définissez sur le serveur.

0

Comme cela a déjà été dit, vous devez vous connecter à un serveur qui gère la connexion à la base de données. Il n'y a aucun moyen d'empêcher efficacement quelqu'un de briser votre sécurité, avec 30 minutes d'effort. Si les clients se connectent quelque peu localement, dans un intranet, l'utilisation d'EJB sur votre serveur d'applications est probablement le meilleur choix ... bien que vous souhaitiez probablement des beans de session sans état, je n'éviterai pas nécessairement les beans pilotés par message.

Pour des distances plus longues où le trafic provient de l'extérieur, j'utiliser webservices via HTTPS

En tout état de cause, la plupart des appservers ont des mécanismes pour exposer leurs EJB est comme webservices, avec le WSDL; et il y a environ une centaine d'utilitaires pour générer des clients, pour appeler le webservice, à partir d'un WSDL (le wsdl2java de l'axe fonctionne assez bien)