Gestion des privilèges des utilisateurs de la base de données [Résolu]

stealone 33 Messages postés samedi 4 décembre 2010Date d'inscription 31 mars 2016 Dernière intervention - 4 oct. 2014 à 23:20 - Dernière réponse : KX 15786 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 22 octobre 2018 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

3 réponses

jordane45 22941 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 octobre 2018 Dernière intervention - 4 oct. 2014 à 23:31
0
Merci
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.


Commenter la réponse de jordane45
stealone 33 Messages postés samedi 4 décembre 2010Date d'inscription 31 mars 2016 Dernière intervention - 4 oct. 2014 à 23:45
0
Merci
Merci Jordan tu m'as suffisamment éclairé sur ce point là.
Commenter la réponse de stealone
KX 15786 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 22 octobre 2018 Dernière intervention - 4 oct. 2014 à 23:50
0
Merci
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...
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.