Gestion des privilèges des utilisateurs de la base de données

Résolu
stealone Messages postés 30 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 31 mars 2016 - Modifié par stealone le 4/10/2014 à 23:38
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 4 oct. 2014 à 23:50
Bonjours à tous les apprentis java de la planète Web. mon problème je le pose ainsi:

mon application swing se connectait jusque là à la base de données grâce à ce petit code:

public class DbConnection {

private static Connection connection = null;

private final String dbDriver = "com.mysql.jdbc.Driver";

private final String dbName = "maBd;

private static String dbUser = "root";

private String dbPassword = "";
private final String dbPort = "3306";


public static DbConnection instance = null;

public DbConnection(){}

public static DbConnection getInstance() {
if (instance == null) {
instance = new DbConnection();
}

instance;
}

public static Connection getConnection() {
if (connection == null) {
instance = getInstance();
try {
Class.forName(instance.dbDriver);

String dbUrl = instance.getDataBaseUrl();
connection = (Connection) DriverManager.getConnection(dbUrl, DbConnection.dbUser, instance.dbPassword);
}catch (ClassNotFoundException | com.mysql.jdbc.CommunicationsException e) {

Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, e);

}catch(SQLException se){

Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, se);
}
}
return connection;
}

alors vu que je souhaite que plusieurs utilisateurs se connectent à cette application via différent clients (poste) je me suis dit qu'il faut gérer les privilèges qui leurs sont accordés pour la base de données. J'ai donc décidé de créer une classe qui retourne un objet de type Connetion en fonction des paramètres de connexion que l'utilisateur insères dans le formulaire de connexion et boum les problèmes commencent.

d'abord mon application me renvoie un message du genre "accès denied for user utilisateur using password yes". bref un truc de ce genre, et ce même si je crée un utilisateur avec les mêmes paramètres de connexion au niveau de la base de donnée, ce qui se vérifie dans la table user de la base mysql . je me suis dit que ce n'est pas surement la bonne marche à suivre. fallait donc que j'obtienne un avis de la communauté. Faut-il garder les paramètres de l'utilisateur tels que définis dans le code et oublier les privilèges des utilisateurs ou il y a mieux.

deuxième question: y a t-il un moyen de connaître le nombre d'utilisateurs connectés à un moment 'm' afin d'en informer les utilisateurs sur le trafique dans la base de données? un peu comme ça se fait avec les pages webs? merci d'avance pour vos précieuses réponses.

Tout ce qui brille n'est pas or.

3 réponses

jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 345
4 oct. 2014 à 23:31
Bonjour.
Tu n'as pas besoin de créer des users mysql différents. ..
Ton appli utilisera le même compte de connexion pour tous les clients.
Par contre tu crées une table pour gérer tes People. .

Pour le nb de connectés. .la aussi tu le gère via une table. ..
A chaque connexion tu ajoute une ligne dans la table avec les infos du connecté. ..et tu pourras requêter ta table pour obtenir l'info.


0
stealone Messages postés 30 Date d'inscription samedi 4 décembre 2010 Statut Membre Dernière intervention 31 mars 2016
4 oct. 2014 à 23:45
Merci Jordan tu m'as suffisamment éclairé sur ce point là.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 127
4 oct. 2014 à 23:50
Bonsoir,

Quelques remarques sur ton code déjà.

Si tu veux faire des singleton fait le sur des objets Datasource, pas sur des Connection, sinon tu vas avoir toujours la même connexion, ce qui risque de te poser plus de problèmes qu'autre chose.
De plus, pour construire ton singleton, il faudrait mettre ton constructeur privé, ça évite qu'il soit instancié.
Notons également que ton getInstance n'est pas thread-safe, tu pourrais utiliser des AtomicReference pour faire ça mieux.

L'appel Class.forName(instance.dbDriver); doit faire une seule fois dans tout le programme, il sert juste à charger la classe en mémoire, il paraît donc maladroit de le mettre dans ta méthode.
Idem pour Logger.getLogger(DbConnection.class.getName()), ce sera toujours le même, il vaut mieux le mettre ailleurs...

Sinon pour revenir aux privilèges de la base de données, ce n'est pas la peine de les gérer toi même, si le droit est insuffisant tu auras des exceptions que tu remonteras à l'utilisateur.
Par contre il faudrait prévoir en effet le cas des différents utilisateurs, avec leur login, mot de passe, et à la limite il serait bien aussi de pouvoir gérer le cas où l'on est plusieurs bases de données.
Tout cela se gère normalement dans un fichier de configuration .properties et tant qu'on y est on mettra un peu de JNDI...

Pour la deuxième question, deux réponses, soit ton appel à la base de données est géré par un serveur qui centralise toutes les requêtes et dans ces cas là il est facile d'incrémenter un compteur quand une requête part et la décrémenter quand le ResultSet arrive. Soit ce sont tes clients qui font directement l'appel à la base de données (c'est pas vraiment l'architecture Java mais admettons) dans ce cas ce sera plus dur de savoir, à part aller taper une requête root (laquelle ?) sur la base de données pour obtenir cette information...
0
Rejoignez-nous