Avatar billede dannv Nybegynder
10. juli 2003 - 09:27 Der er 10 kommentarer og
1 løsning

Logout ved container managed security

Jeg har en applikation som jeg har sat op til at benytte contaier managed security. Jeg bruger FORM login metoden og det kører bare...

Men jeg vil gerne tilføje en logout funktionalitet. Jeg kan se at der er tre (el 4) ting som bliver sat ved login:

getRemoteUser returnere så brugernavn.
isUserInRole kontrollere ved logon at man har korrekt rolle.
getUserPrincipal returnere noget som bla. indeholder brugernavn.

Det strå i Servlet spec at ved logout:
---------**********---------
Being logged in to a web application corresponds precisely to there being a
valid non-null value in getUserPrincipal method, discussed in SRV.12.3 and the
javadoc. A null value in that method indicates that a user is logged out.
---------**********---------

Det jeg havde tænkt mig var at gøre noget ligende:

session.invalidate();
getRemoteUser = (sætte den til null);
getUserPrincipal = (sætte den til null);

response.sendRidirect("home.html");

Men jeg kan ikke noget steder finde en metode til at sætte getRemoteUser og getUserPrincipal til 'null'.

Er der en der kan fortælle hvordan dette gøres???
Avatar billede arne_v Ekspert
10. juli 2003 - 09:33 #1
Sker det ikke automatisk når du kalder session.invalidate() ?
Avatar billede dannv Nybegynder
10. juli 2003 - 11:59 #2
Jo man bliver logget ud, men der er stadig værdier i getRemoteUser og getUserPrincipal! Men jeg tror efter at have kigget lidt mere at det nok ikke er noget problem..
Avatar billede arne_v Ekspert
10. juli 2003 - 17:43 #3
Jeg har lige testet med Tomcat 4.1.24 - jeg får fint null og null fir
getRemoteUser og getUserPrincipal efter en session.invalidate() !

Hvilken server bruger du ?
Avatar billede dannv Nybegynder
11. juli 2003 - 09:04 #4
jamen, det må siges at være den samme!! (også Tomcat 4.1.24) Jeg bruger blot følgende System.out.println("remote user: "+request.getRemoteUser());
System.out.println("user principal: "+request.getUserPrincipal());
både før og efter session.invalidate(). Er der en anden metode?

Det var fordi at jeg ville benytte getRemoteUser() til finde brugernavnet, som jeg ville bruge i nogle formularer. Det ville være nemmere da det jo allerede eksisterer. Alternativt ville jeg smide brugernavn ned i et session objekt, men så har jeg ligesom de samme infomationer to steder.

(OBS husk lige at skrive et svar så jeg kan give nogle points) :-)
Avatar billede arne_v Ekspert
11. juli 2003 - 09:51 #5
Nej jeg bruger samme metode.

Hos mig returnerer request.getUserPrincipal() null efter en
session.invalidate().

Men det kan måske have noget med scenariet at gøre.

Hvordan tester du ? I samme side ? Jeg tester på en anden side.
Avatar billede arne_v Ekspert
11. juli 2003 - 09:51 #6
svar
Avatar billede dannv Nybegynder
11. juli 2003 - 12:07 #7
min logout side ser således ud:

<%@ page language="java" import="java.util.*" import="java.util.Enumeration" import="javax.servlet.ServletRequest" %><%
String base = (String) application.getAttribute("base");
System.out.println("remote user: "+request.getRemoteUser());
System.out.println("user principal: "+request.getUserPrincipal());
System.out.println("Session id: "+session.getId());

if(request.getRemoteUser()!=null && request.getUserPrincipal()!=null && session.getId()!=null)
{
  session.invalidate();
  System.out.println("Logged out: ");
System.out.println("remote user: "+request.getRemoteUser());
System.out.println("user principal: "+request.getUserPrincipal());
  response.sendRedirect("../Welcome.html");
//  RequestDispatcher rd = request.getRequestDispatcher("/Welcome.html");
//  rd.forward(request, response);
}
else
{
  response.sendRedirect("../Welcome.html");
//  RequestDispatcher rd = request.getRequestDispatcher("/Welcome.html");
//  rd.forward(request, response);
}
%>
Avatar billede arne_v Ekspert
11. juli 2003 - 12:22 #8
Så kan man hypotese godt være rigtig.

Når requesten kommer ind så mapper serveren den til en session, den
henter UserPrincipal fra sessionen og gemmer i requesten.

Du kalder session.invalidate som fjerner UserPrincipal fra sessionen,
men request har stadigvæk en reference til den.

Ved næste requests hentes imidlertid null fra sessionen.
Avatar billede arne_v Ekspert
11. juli 2003 - 12:22 #9
Du kunne teste min hypotese ved at redirecte til Welcome.jsp
og print request.getUserPrincipal ud fra den.
Avatar billede arne_v Ekspert
11. juli 2003 - 12:22 #10
Jeg håber ikke at jeg snakker sort.
Avatar billede dannv Nybegynder
11. juli 2003 - 12:55 #11
ja, tja, det ser jo faktisk ud som du har ret.... tak for det.
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