Avatar billede cow-tilter Nybegynder
11. august 2003 - 16:45 Der er 35 kommentarer og
1 løsning

Sikring af login sider

Jeg har lavet en login side hvor brugeren sendes videre vhj. af response.sendRedirect. Mit problem består nu i at man kan komme ind på de sider der er beskyttet af adgangskode, ved at indtaste linket. Jeg har læst lidt om det her: http://www.eksperten.dk/spm/248103 , men det eksempel der er her virker ikke ( det er den med  request.setAttribute("LoggedIn",new Boolean(true)); jeg tænker på)
Er det blot en fejl der har sneget sig ind, eller skal det laves på en anden måde?
Avatar billede arne_v Ekspert
11. august 2003 - 16:54 #1
Koden er forkert !

Du skal gemme attributten i session ikke i request !!
Avatar billede arne_v Ekspert
11. august 2003 - 16:56 #2
Altså:

(Boolean)request.getSession().getAttribute("LoggedIn")

og:

request.getSession().setAttribute("LoggedIn",new Boolean(true))
Avatar billede arne_v Ekspert
11. august 2003 - 17:00 #3
Du har iøvrigt mulighed for at lade serveren checke adgangen
i.s.f. din kode.
Avatar billede cow-tilter Nybegynder
11. august 2003 - 17:06 #4
Når jeg prøver at sætte det ind får jeg bare fejlen:
Note: sun.tools.javac.Main has been deprecated.
/login2/login.jsp:46: Invalid type expression.
    (Boolean)request.getSession().getAttribute("LoggedIn") //s\u00e5 kan du
    ^
fra andre sider se om brugeren er logget ind
   
/login2/login.jsp:47: Invalid declaration.
    response.sendRedirect("up2load.jsp"); //send brugeren videre til en ny side
                        ^
Avatar billede arne_v Ekspert
11. august 2003 - 17:09 #5
Lyder lidt mystisk.

Når det er JSP behøver du iøvrigt ikke bruge requuest.getSession(), men kan
bare bruge session.
Avatar billede arne_v Ekspert
11. august 2003 - 17:11 #6
Her er et stykkke grimt JSP som illusterer lidt hvad man kan (og det virker):

<%@page import="java.util.*"%>
<%
if((session == null) || (session.getAttribute("username") == null)) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    if((username!=null)&&(password!=null)) {
        if((username.equals("arne")&&password.equals("arne"))||(username.equals("system")&&password.equals("system"))) {
            session.setAttribute("username", username);
            %>
            Press reload.
            <%
        } else {
            %>
            Invalid username/password.
            <%
            return;
        }
    } else {
      %>
      <form action="secure.jsp" method="GET">
      Username: <input type="text" name="username"><br>
      Password: <input type="text" name="password"><br>
      <input type="submit" value="Login">
      </form>
      <%
      return;
    }
} else {
    if(session.getAttribute("username").equals("system")) {
        %>
        <%=(new Date())%>
        <%
        return;
    } else {
        %>
        No access.
        <%
        return;
    }
}
%>
Avatar billede arne_v Ekspert
11. august 2003 - 17:14 #7
Jeg har også den her variant som verificerer username/password mod en database:

<%@page import="java.sql.*"%>
<%
if((session == null) || (session.getAttribute("username") == null)) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    if((username!=null)&&(password!=null)) {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection conn = DriverManager.getConnection("jdbc:odbc:TestMSAccess", "", "");
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT password FROM Tomcat_users WHERE username='" + username + "'");
        if(rs.next() && rs.getString(1).equals(password)) {
            session.setAttribute("username", username);
            response.sendRedirect("secure2.jsp");
            return;
        } else {
            %>
            Invalid username/password.
            <%
            return;
        }
    } else {
      %>
      <form action="secure2.jsp" method="GET">
      Username: <input type="text" name="username"><br>
      Password: <input type="text" name="password"><br>
      <input type="submit" value="Login">
      </form>
      <%
      return;
    }
} else {
    if(session.getAttribute("username").equals("system")) {
        %>
        <strong>It works !!!!</strong>
        <%
        return;
    } else {
        %>
        No access.
        <%
        return;
    }
}
%>
Avatar billede cow-tilter Nybegynder
12. august 2003 - 20:24 #8
Min kode ser sådan ud:

<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>

<%! ResultSet rs = null;%>
<%! ResultSet rs1 = null;%>
<%! ResultSet rs2 = null;%>
<%
        Class.forName("org.gjt.mm.mysql.Driver");
        Connection db = DriverManager.getConnection("jdbc:mysql://localhost:3306/login");
        Statement s = db.createStatement();
        rs = s.executeQuery("select id, pass from sos");
       
       
        Class.forName("org.gjt.mm.mysql.Driver");
        Connection db1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/login");
        Statement s1 = db1.createStatement();
        rs1 = s1.executeQuery("select id2, pass2 from post");
        db1.close();
       
        Class.forName("org.gjt.mm.mysql.Driver");
        Connection db2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/login");
        Statement s2 = db2.createStatement();
        rs2 = s2.executeQuery("select id3, pass3 from admin");
        db2.close();
%>
<%
  String username=request.getParameter("username");
  String password=request.getParameter("password");
  String id=(rs.getString(1));
  String pass=(rs.getString(2));
  String id2=(rs1.getString(1));
  String pass2=(rs1.getString(2));
  String id3=(rs2.getString(1));
  String pass3=(rs2.getString(2));
%>

<%
  if((username.equals(id)&&password.equals(pass))||(username.equals(id2)&&password.equals(pass2))) {
    (Boolean)request.getSession().getAttribute("LoggedIn"); //så kan du fra andre sider se om brugeren er logget ind
    response.sendRedirect("up2load.jsp"); //send brugeren videre til en ny side
} else {
} if((username.equals(id3)&&password.equals(pass3))) {
    (Boolean)request.getSession().getAttribute("LoggedIn") //så kan du fra andre sider se om brugeren er logget ind
    response.sendRedirect("admin.jsp"); //send brugeren videre til en ny side
} else {
response.sendRedirect("fejl.jsp");

}
%>
Avatar billede cow-tilter Nybegynder
12. august 2003 - 20:25 #9
Jaja, med visse fejl, men den virker.

Når jeg kører den får jeg følgende fejl:

Note: sun.tools.javac.Main has been deprecated.
/login2/login.jsp:39: Invalid expression statement.
    (Boolean)request.getSession().getAttribute("LoggedIn"); //s\u00e5 kan du fra andre sider se om brugeren er logget ind
    ^
1 error, 1 warning
Avatar billede cow-tilter Nybegynder
12. august 2003 - 20:26 #10
Hovsa, der skal stå  db.close();    efter den første forbindelse til databasen...
Avatar billede arne_v Ekspert
12. august 2003 - 20:49 #11
Du kan sagtens bruge den samme connection og den samme statement til
flere SQL sætninger.

Ja - det er faktisk anbefalelsesværdigt.

Nå men det har jo ikke noget med dit problem at gøre.
Avatar billede cow-tilter Nybegynder
12. august 2003 - 20:51 #12
Jeg er godt klar over det, og har da også eksperimenteret lidt med det...
Avatar billede arne_v Ekspert
12. august 2003 - 20:51 #13
Der mangler et semilkolon efter:

(Boolean)request.getSession().getAttribute("LoggedIn")

og det er nok årsagen til din fejl !
Avatar billede arne_v Ekspert
12. august 2003 - 20:52 #14
Jeg har iøvrig en mistanke om at du ikke mener:

(Boolean)request.getSession().getAttribute("LoggedIn") ;

men:

request.getSession().setAttribute("LoggedIn",new Boolean(true)) ;
Avatar billede cow-tilter Nybegynder
12. august 2003 - 20:56 #15
Skal der stå request.getSession().setAttribute("LoggedIn",new Boolean(true)) ;
i stedet for (Boolean)request.getSession().getAttribute("LoggedIn") ; ?

Sådan som jeg har det nu, står (Boolean)request..... på den side der skal give adgangen, og request.getSession()..... står på den side man logger ind på.
Avatar billede arne_v Ekspert
12. august 2003 - 21:01 #16
request.getSession().setAttribute("LoggedIn",new Boolean(true))

sætter en attribut "LoggedIn" til værdien true i sessionen.

(Boolean)request.getSession().getAttribute("LoggedIn")

henter en attribut "LoggedIn" fra sessionen (og gør ikke noget med den).
Avatar billede cow-tilter Nybegynder
12. august 2003 - 21:02 #17
jamen så bytter jeg da lige om på dem... Det kunne godt være at det ville hjælpe...
Avatar billede cow-tilter Nybegynder
12. august 2003 - 21:16 #18
er der nogen bestemt klasse jeg skal kalde for at få (Boolean) til at virke?
Avatar billede arne_v Ekspert
12. august 2003 - 21:20 #19
Til at virke ?

Mener du til at bruge den ?

if(((Boolean)request.getSession().getAttribute("LoggedIn")).booleanValue()) {
...
}
Avatar billede cow-tilter Nybegynder
12. august 2003 - 21:26 #20
jep, så virker det... Nu hvor vi er ved det kunne du så fortælle mig lidt omkring det med connection pool, eller er det bedre at oprette et nyt spørgsmål? Jeg skal nok give flere point.
Avatar billede arne_v Ekspert
12. august 2003 - 21:28 #21
Jeg kan godt fortælle lidt om connection pool.

Hvilken server bruger du ?
Avatar billede cow-tilter Nybegynder
12. august 2003 - 21:30 #22
Jeg bruger Resin og MySQL
Avatar billede arne_v Ekspert
12. august 2003 - 21:34 #23
Stort set alt du skal bruge står her:
  http://www.caucho.com/resin/ref/db-config.xtp
Avatar billede cow-tilter Nybegynder
13. august 2003 - 18:16 #24
Jeg har ændret driver name og url'en på min database i resin.conf, men når jeg prøver at bruge det eksempel de bringer på siden, får jeg en fejl:

java.lang.NullPointerException
    at _test1__jsp._jspService(/login2/test1.jsp:13)
    at com.caucho.jsp.JavaPage.service(JavaPage.java:75)
    at com.caucho.jsp.Page.subservice(Page.java:497)
    at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182)
    at com.caucho.server.http.Invocation.service(Invocation.java:315)
    at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:246)
    at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163)
    at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
    at java.lang.Thread.run(Thread.java:536)
Avatar billede cow-tilter Nybegynder
13. august 2003 - 18:20 #25
Nå.. jeg fandt ud af det. Jeg ændrede lidt i min resin.conf, der var en lille fejl mht. hvilken database den skulle bruge.
Avatar billede cow-tilter Nybegynder
13. august 2003 - 18:38 #26
Jeg har nu prøvet at kalde flere tabeller gennem den samme forbindelse, men den opfører sig mærkeligt. Nogle gange virker den, andre gange ikke. Nogle gange virker det hvis jeg opdaterer siden med fejlen på.
Avatar billede arne_v Ekspert
13. august 2003 - 18:40 #27
Hvilken fejl får du ?
Avatar billede cow-tilter Nybegynder
13. august 2003 - 18:41 #28
java.lang.NullPointerException
    at _login__jsp._jspService(/login2/login.jsp:10)
    at com.caucho.jsp.JavaPage.service(JavaPage.java:75)
    at com.caucho.jsp.Page.subservice(Page.java:497)
    at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182)
    at com.caucho.server.http.Invocation.service(Invocation.java:315)
    at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:246)
    at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163)
    at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
    at java.lang.Thread.run(Thread.java:536)
Avatar billede arne_v Ekspert
13. august 2003 - 18:46 #29
Må jeg se lidt kode igen ?
Avatar billede cow-tilter Nybegynder
13. august 2003 - 18:52 #30
Jep. Jeg har lige hurtigt lavet en anden side der bare henter nogle værdier i databasen, og viser dem på skærmen, og den virker helt fint. En anden ting er at det ikke er når jeg opdaterer at jeg kommer ind på siden, men når jeg trykker enter (altså trykker i adr. linien, og så på enter). Det er ikke sikkert at det er en fejl i pool... Her kommer koden.
Avatar billede cow-tilter Nybegynder
13. august 2003 - 18:55 #31
<%@ page import='java.sql.*, javax.sql.*, javax.naming.*, java.util.*' %>

<%
Context ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/test");

Connection conn = ds.getConnection();

try {
  Statement s = conn.createStatement();
  ResultSet rs = s.executeQuery("SELECT id, pass FROM sos");
  Statement s1 = conn.createStatement();
  ResultSet rs1 = s1.executeQuery("SELECT id2, pass2 FROM post");
  Statement s2 = conn.createStatement();
  ResultSet rs2 = s2.executeQuery("select id3, pass3 from admin");

  %><h2>Brooms:</h2><%
    while (rs.next()) { %>
<%= rs.getString(1) %> <%= rs.getString(2) %><br><%
  }

} finally {
  conn.close();
}
%>
<%
  String username=request.getParameter("username");
  String password=request.getParameter("password");
  String id=(rs.getString(1));
  String pass=(rs.getString(2));
  String id2=(rs1.getString(1));
  String pass2=(rs1.getString(2));
  String id3=(rs2.getString(1));
  String pass3=(rs2.getString(2));
%>

<%
  if((username.equals(id)&&password.equals(pass))||(username.equals(id2)&&password.equals(pass2))) {
    request.getSession().setAttribute("LoggedIn",new Boolean(true));
    response.sendRedirect("up2load.jsp"); //send brugeren videre til en ny side
} else {
} if((username.equals(id3)&&password.equals(pass3))) {
    request.getSession().setAttribute("LoggedInAdmin",new Boolean(true));
    response.sendRedirect("admin.jsp"); //send brugeren videre til en ny side
} else {
response.sendRedirect("fejl.jsp");

}
%>
Avatar billede arne_v Ekspert
13. august 2003 - 19:03 #32
Du kan godt genbruge det samme statement til flere SQL sætninger.
Avatar billede arne_v Ekspert
13. august 2003 - 19:04 #33
Men jeg tror at din fejl skyldes at du bruger ResultSet's efter
at du har closed Connection.

Det duer ikke.

Du skal først close connection når du er færdig med at bruge databasen.
Avatar billede cow-tilter Nybegynder
13. august 2003 - 19:34 #34
Jeg fjernede ResultSet, og definerede derefter rs til:
<%! ResultSet rs = null;%>
<%! ResultSet rs1 = null;%>
<%! ResultSet rs2 = null;%>

Så stoppede problemerne... Så må du hellere få dine point. Hvor mange vil du have?
Avatar billede arne_v Ekspert
13. august 2003 - 19:58 #35
Det er vel op til dig at afgøre.
Avatar billede cow-tilter Nybegynder
13. august 2003 - 20:08 #36
Tja, så får du 60.

Hvis du vil have mig undskyldt! Jeg må trække mig tilbage nu. Vigtige opgaver ligger forude...
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