16. august 2004 - 18:21Der er
25 kommentarer og 1 løsning
SQL forespørgsel eller DB
Hejsa Jeg forsøger at lave en JSP side, hvor man skal logge ind. Indtil videre gør jeg brug af en hsqldb database, hvor jeg gemmer brugernavn, password, rettighed osv. Men jeg kan ikke helt finde ud af om det er smartest at lave SQL forespørgsler for at validerer brugere, eller om det er smartest at lave brugerobjekter og gennemsøge disse?
Hvordan gør man i praksis, og hvordan vil man oftes gøre(gerne eksempel)
Jeg kører det så ikke på en server, men sidder bare og leger lidt med JSP i Oracle JDeveloper - det har en lille server indbygget.
Hvis jeg nu laver det med en SQL forespørgsel vil man så typisk gøre noget i stil med dette:
public synchronized int validering(String brugernavn, String password) { try { String s="select Rettighed "+ "from Bruger "+ "where Brugernavn ='"+brugernavn+"' AND Password ='"+password+"'"; ResultSet rs = db.doQuery(s);
while (rs.next()) //hvis der er mere data i databasen { rettighed=rs.getString("Rettighed"); //hentes data fra databasen vha. get-metoder } } catch(Exception e){System.out.println("Fejl under validering.... "+e);}
if(rettighed!=null) { return rettighed; } else { return -1; } } eller er det helt hen i vejret?
Kommentarer: - prepared statements har nogle fordele båd eperformance og sikkerhed - du skal huske at resette rettighed til null inden du kalder - ofte foretrække rman at bruge roles fremfor et rettigheds tal
okay, som jeg forstår det ud fra din artikkel, er role bare en string.
Når folk så er logget ind vil man så ikke bare lave en session.setAttribute("rettighed", "administrator"); ?
Jeg kan ikke lige se hvorfor jeg skal huske at resette rettighed inden kald, da rettighed vel blive null, hvis den ikke kan finde brugeren i databasen?
Håber det er iorden med lidt tillægsspørgsmål, smider lige lidt flere point i puljen når vi når så langt :)
Væ riøvrigt opmærksom på at det somme tider er svært at finde System.out.println outputtet for JSP side - et logging framework som log4j er ofte bedre.
Hvis du bruger container managed security kan du både bruge declarative security (fortælle hvilke roller må tilgå hvilke directories) og programmatic security (test i din JSP kode med request.isUserInRole("xxxx") ).
Bare at gemme i session er en OK løsning som er set masser af gange. Jeg ville bare lige bringe nogle af de andre muligheder på banen.
Grunden til at roller er så brugte er de understøtter den mulighed at en bruger kan have flere roller og dermed at man har en matrix security med brugere på den ene dimension og funktion på den anden dimension. Simple løsninger bruger normalt hirakisk security sådan at guest kan næsten ingenting, user kan list, operator kan meget og administrator kan alt.
Altså det jeg tænker på er om man på en måde kan smide resette i metoden i stedet for, så man er sikker på, at man ikke glemmer det et andet sted i koden - det er vel det smarteste.
Jeg er jo så nød til at bruge application managed security, så her står jeg vel bare selv for det hele :( Har en skod comp, der knap nok har kræfter til at køre JDev, så det vil nok være lige rigeligt også at smide en rigtig j2ee server på.
public synchronized int validering(String brugernavn, String password) { rettighed = null; // <---- try { String s="select Rettighed "+ "from Bruger "+ "where Brugernavn ='"+brugernavn+"' AND Password ='"+password+"'"; ResultSet rs = db.doQuery(s);
while (rs.next()) //hvis der er mere data i databasen { rettighed=rs.getString("Rettighed"); //hentes data fra databasen vha. get-metoder } } catch(Exception e){System.out.println("Fejl under validering.... "+e);}
Har slet ikke testet det endnu, men bare tastet lidt. Men jeg har tænkt mig at lave det til en public synchronized String validering(..) istedet for, og så skal den selvfølgelig ikke kunne returnerer -1. Desuden prøver jeg lige at lave det til prepared statement, så sikkerheden bliver bedre :)
Jep viste ikke der var problemer ellers. Men kapitel 5.4.2 på http://javabog.dk/jsp forklarer det meget godt synes jeg. Ved ikke om der er flere grunde, men det var i hvert fald forklaring nok til at jeg fremover vil bruge prepared statements! :)
public synchronized String validering(String brugernavn, String password) { rettighed = null; try { pstmt = conn.prepareStatement("select role from user_table where brugernavn = ? AND password = ?"); pstmt.setString(0, brugernavn); pstmt.setString(1, password); ResultSet rs = pstmt.executeQuery(); while (rs.next()) //hvis der er mere data i databasen { rettighed=rs.getString("role"); //hentes data fra databasen vha. get-metoder System.out.println("validering: "+rettighed); } } catch(Exception e){System.out.println("Fejl under validering.... "+e);}
Men jeg får en fejl i den metode, nemlig: "Fejl under validering.... java.lang.ArrayIndexOutOfBoundsException: -1".
når jeg kører denne jsp side(og indtaster det rigtige brugernavn og password): <%@ page contentType="text/html;charset=windows-1252" import="java.sql.*" import="hsqldb.*" %> <html> <head><title>login2</title></head> <body> <%! private String bn, ak; private static Db_Handler db; %> <% // hvis brugernavn="Jacob" og adgangskode="hemli" logges der ind. // dette burde selvfølgelig hentes fra en database eller lign. bn = request.getParameter("brugernavn"); ak = request.getParameter("adgangskode"); try { db = new Db_Handler("db_file"); } catch (Exception ex1) { ex1.printStackTrace(); // could not start db }
if (db.validering(bn, ak).equals("Administrator")) { // sæt attributten "logget ind" i sessionen session.setAttribute("logget ind", "ja"); session.setAttribute("rettighed", "administrator"); out.println("Du er logget korrekt ind som Administrator.<br>"); } else { // fjern attributten "logget ind" fra sessionen session.removeAttribute("logget ind"); out.println("Forkert brugernavn eller adgangskode.<br>"); } %> Du kan nu prøve at gå videre til <a href="Login3.jsp">den beskyttede side</a> eller gå tilbage og <a href="Login.jsp">logge ind</a> igen. </body> </html>
Jeg når aldrig ind i whileløkken i valideringsmetoden, så måske det er min prepared statement den er gal med?
Ja det var da noget der hjalp, for nu kom der en ny fejl.
Fejl under validering.... java.sql.SQLException: Table not found: USER_TABLE in statement [select role from user_table where brugernavn = 'Torben' AND password = 'test']
Den siger altså at den ikke kan finde den pågældende tabel, men den findes altså.
Jeg har sat Run Directory til det bibliotek hvor jeg har jsp filerne (D:\jdev903\jdev\mywork\JSP\LoginDB\public_html), så der ligger database filerne som hsqldb laver altså. Har du nogen ide om hvad der kan være galt?
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.