Avatar billede dennism Nybegynder
29. november 2006 - 10:03 Der er 26 kommentarer og
1 løsning

Java: mySQL brugere

Jeg er ved at udvikle et system som kører på en mySQL-database. Jeg har derfor brug for, at der kan oprettes brugere i mySQL-databasen så andre bruger end root kan logge på - vil naturligvis være langt mere praktisk og sikkert, at hver bruger logger på databasen med sit egen username og password istedet for at alle bruger root.

Jeg starter med at logge ind med min root-bruger på denne måde:
  connection = DriverManager.getConnection("jdbc:mysql://"+myServer+"/myDB", root, myPassword);

Derefter kan jeg f.eks. oprette en bruger jeg kalder "dm" som har adgang til den pågældende database:

  Statement statement = connection.createStatement();
  int rowsinserted = statement.executeUpdate(INSERT INTO user (Host,User,Password) VALUES('%','dm','myPassword'););

1) Ved at angive at host=%, har jeg sikret at brugeren både kan logge på via localhost (altså samme maskine som databasen kører på) samt via andre maskiner som tilslutter via IP'en, ik?
2) Hvordan sikrer jeg videre, at den bruger jeg opretter, kun har adgang til den pågældende database (myDB) og ikke alle lige som root?

Mit næste, og noget større problem er, hvordan jeg efterfølgende, i mit program har mulighed for at finde ud af hvilke mySQL-bruger der har adgang til databasen (skal lave et system som lister brugerne, så man kan slette dem, ændre password mm.)
Jeg går ud fra, at jeg skal bruge et ResultSet:
  Statement statement = connection.createStatement();
  ResultSet res = statement.executeQuery("");

3) hvordan kan jeg lave en query, som returnerer de brugere som har adgang til databasen "myDB"?
Avatar billede arne_v Ekspert
29. november 2006 - 13:14 #1
Avatar billede arne_v Ekspert
29. november 2006 - 13:15 #2
vær opmærksom på at du med GRANT og REVOKE kan styre adgangen hekt ned på
SELECT/INSERT/UPDATE/DELETE x tabel navn/kolonne navn
Avatar billede arne_v Ekspert
29. november 2006 - 13:16 #3
for at se brugere skal du nok selecte fra tabellen mysql.user
Avatar billede dennism Nybegynder
29. november 2006 - 14:29 #4
Hvordan kan jeg i mysql.user se hvilke databaser bruger har adgang til?
Avatar billede dennism Nybegynder
29. november 2006 - 14:36 #5
Snakker vi en GRANT som denne:
GRANT ALL PRIVILEGES ON *.* TO 'dm'@'%' IDENTIFIED BY 'myPassword' WITH GRANT OPTION;

Mit problem er her, hvordan jeg sikrer at brugeren kun har adgang til en specifik database? Hvilke priviegier bør jeg give adgang til, istedet for ALL? SELECT, INSERT, UPDATE, DELETE og ikke mere?
Avatar billede arne_v Ekspert
29. november 2006 - 14:59 #6
GRANT ALL PRIVILEGES ON *.* TO ...

skal nok vaere

GRANT xxx,yyy,zzz PRIVILEGES ON aaa.bbb TO

ALL og *.* er ligesom ikke saerligt restriktivt
Avatar billede dennism Nybegynder
29. november 2006 - 15:15 #7
Og hvad er x, y, z, a og b i overstående tilfælde?
Avatar billede dennism Nybegynder
29. november 2006 - 15:17 #8
Har du et svar på, hvordan jeg i mysql.user kan se, hvilke databaser brugeren har adgang til?
Avatar billede arne_v Ekspert
29. november 2006 - 15:55 #9
xxx,yyy,zzz er de privs du granter

http://dev.mysql.com/doc/refman/5.0/en/grant.html har en liste

aaa.bbb er det du giver adgang til (aaa=database,bbb=tabel eller view)
Avatar billede arne_v Ekspert
29. november 2006 - 16:40 #10
jeg skal lige undersoege hvordan man kan faa en liste over brugernes adgang
Avatar billede dennism Nybegynder
29. november 2006 - 16:56 #11
tak for det!
Avatar billede arne_v Ekspert
29. november 2006 - 18:11 #12
proev og hent fra tabellen mysql.table_priv
Avatar billede pidgeot Nybegynder
29. november 2006 - 18:14 #13
Jeg vil nu anbefale SHOW GRANTS såfremt det er en bestemt bruger du skal have fat i (og det er det jo nok):

http://dev.mysql.com/doc/refman/5.0/en/show-grants.html
Avatar billede arne_v Ekspert
29. november 2006 - 18:23 #14
det ville jeg ogsaa - hvis jeg havde kendt den

:-)
Avatar billede arne_v Ekspert
29. november 2006 - 18:27 #15
det er ikke saa paent at snaske rundt i mysql databasen

hvis man vil lave det mere low level, saa boer man som minimum selecte
fra INFORMATION_SCHEMA.TABLE_PRIVILEGES
Avatar billede pidgeot Nybegynder
29. november 2006 - 22:02 #16
Mht. spørgsmål 1, så gælder % ikke nødvendigvis for localhost:

Without the localhost account, the anonymous-user account for localhost that is created by mysql_install_db would take precedence when monty connects from the local host. As a result, monty would be treated as an anonymous user. The reason for this is that the anonymous-user account has a more specific Host column value than the 'monty'@'%' account and thus comes earlier in the user table sort order. (user table sorting is discussed in Section 5.8.5, “Access Control, Stage 1: Connection Verification”.)

(Kilde: http://dev.mysql.com/doc/refman/5.0/en/adding-users.html)

Så hvis du ikke har sørget for at der ikke er en anonym bruger på localhost, så skal der oprettes for både localhost og %. Hvis du har fjernet den, skulle det dog være nok med %-brugeren, selvom der connectes fra localhost.

Det er i øvrigt nok snarere SCHEMA_PRIVILEGES du skal bruge (frem for TABLE_PRIVILEGES), da det er denne der indeholder tilladelser på database-niveau (den anden er på tabel-niveau). Med denne får du listen over brugerne der har adgang til "myDB"-databasen ved at køre queryen

SELECT DISTINCT GRANTEE FROM INFROMATION_SCHEMA.SCHEMA_PRIVILEGES WHERE TABLE_SCHEMA='myDB'

...og evt. tilføje det privilegie du vil vide om de har som en ekstra betingelse (check på PRIVILEGE_TYPE).
Avatar billede dennism Nybegynder
01. december 2006 - 21:16 #17
Kan I fortælle mig, hvordan jeg bruger SHOW GRANTS til at finde de brugere som har adgang til min database?

Måske I kan hjælpe her:
http://www.eksperten.dk/spm/748319
Avatar billede arne_v Ekspert
01. december 2006 - 21:42 #18
har du proevet pidgeots SELECT ovenfor ?
Avatar billede pidgeot Nybegynder
01. december 2006 - 21:46 #19
Hvis det du i stedet skal bruge er en liste over alle brugere der er oprettet kan du bruge SELECT DISTINCT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES i stedet for den anden.
Avatar billede dennism Nybegynder
01. december 2006 - 22:25 #20
Jeg har nu denne lille kode:

try {
            ResultSet sql = MySQL.query("SELECT DISTINCT GRANTEE FROM INFROMATION_SCHEMA.SCHEMA_PRIVILEGES WHERE TABLE_SCHEMA='"+MySQL.getDatabase()+"'");
            System.out.println("Udskriver brugere med adgang til databasen:");
            for(int n=0; sql.next(); n++) {
                System.out.println(sql.getString("username"));
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }

Men det resulterer desværre i en lidt trist fejl-besked:
java.sql.SQLException: SELECT command denied to user 'dm'@'localhost' for table 'SCHEMA_PRIVILEGES'

Jeg er sådan set heller ikke interessret i at alle bruger har adgang til tabellerne i mysql.*, så måske jeg skulle lave én bruger som har adgant til denne og så, hver gang jeg skal bruge dette, skifte til denne bruger? Hvordan giver jeg en bruger adgang til SCHEMA_PRIVILEGES?
Avatar billede pidgeot Nybegynder
01. december 2006 - 22:44 #21
Alle brugere bør have adgang til INFORMATION_SCHEMA. Det skulle vel aldrig være fordi at du kører med en ældre MySQL end 5.0? INFORMATION_SCHEMA kom først til i den version, nemlig.
Avatar billede dennism Nybegynder
01. december 2006 - 22:58 #22
Nej, jeg kører 5.0.18.

Når jeg logger ind som root, kan jeg også se at jeg har en database der hedder INFORMATION_SCHEMA. Har alle brugere adgang til den som standard?
Avatar billede dennism Nybegynder
01. december 2006 - 22:58 #23
Har du et MSN? Kunne godt tænke mig at få dette løst hurtigt. Hvis du har tid/lyst til tilføj dennis@demaweb.dk
Avatar billede pidgeot Nybegynder
01. december 2006 - 23:21 #24
Der var lige sneget sig en lille tyrkfejl ind i den SQL-sætning...

SELECT DISTINCT GRANTEE FROM INFROMATION_SCHEMA.SCHEMA_PRIVILEGES WHERE TABLE_SCHEMA='myDB'

skulle have været

SELECT DISTINCT GRANTEE FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES WHERE TABLE_SCHEMA='myDB'

Sådan kan det jo gå :)
Avatar billede dennism Nybegynder
02. december 2006 - 00:50 #25
Efter at have knoklet hele aftenen, fik vi det til at du ;)

Smider du lige et svar her?
Avatar billede pidgeot Nybegynder
02. december 2006 - 10:59 #26
Værsgo :)

(Hvis nogen er i tvivl - ja, jeg ved godt at §2.1.12 siger man ikke må tildele point for en løsning, der ikke er tilgængelig for alle Eksperten.dk’s brugere, men det vi arbejdede med er enten gennemgået herinde, eller ikke en del af det spørgsmål der er stilt.)
Avatar billede dennism Nybegynder
02. december 2006 - 11:05 #27
Vi kunne også kopiere en log fra vores MSN herover? Men det er der næppe nogen der har tålmodighed til at læse :)

Tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester