torsdag 7 januari 2010

Säkerhet i Java EE 6, HttpServletRequest

Jag har kollat lite på HttpServletRequest-API:et i nya Java EE 6 och dess stöd för autentisering.

Fyra sorters autentisering
Man konfigurerar en autentiseringsmetod för sin servlet-kontext. Alla JEE 6-containers stödjer:
  • Basic Authentication, BASIC_AUTH
  • Formulärbaserad autentisering, FORM_AUTH
  • Autentisering med klientcertifikat (2-vägs-SSL), CLIENT_CERT_AUTH
Digest Authentication, DIGEST_AUTH, anses fortfarande vara för ovanligt och behöver därför inte stödjas. Snacka om dödlig låsning. Digest Authentication har ju hela tiden varit tänkt som steget bort från Basic Authentication och är i grund och botten inloggning med saltad MD5-hash där klient och server väljer varsitt salt. Synd att det inte blev ett krav.

HttpServletRequest 3.0 innehåller tre nya säkerhetsmetoder: authenticate(), login() och logout(). Så här fungerar de:

Autenticate
boolean authenticate(HttpServletResponse response) throws IOException, ServletException

Kollar om användaren är autentiserad. Helt enkelt ett sätt att införa accesskontroll på sin servlet. Den returerar true om getUserPrincipal(), getRemoteUser(), och getAuthType() är satta, dvs inte returnerar null. Returnerar false om autentisering misslyckades och en felsida har skapats i response-objektet.

Kastar en ServletException om autentisering misslyckades och anroparen ska hantera felet.

Login
void login(String username, String password) throws ServletException

Inloggningsmetoden. Kontrollerar användarnamn och lösenord enligt den autentiseringsmetod som konfigurerats för containern. Om den här metoden returnerar (dvs inte kastar ett undantag) så måste värden vara satta så att getUserPrincipal(), getRemoteUser(), och getAuthType() inte returnerar null.

Kastar en ServletException om den konfigurerade autentiseringen inte accepterar användarnamn/lösenord (t ex klientcertifikat), om användaren redan är inloggad, eller om inloggningen misslyckades (t ex fel lösenord).

Logout
void logout() throws ServletException

Ser till att getUserPrincipal(), getRemoteUser(), och getAuthType()returnerar null. Kastar en ServletException om utloggningen misslyckades.

Sen finns förstås de gamla metoderna som stöd:
  • String getAuthType()
  • String getRemoteUser()
  • boolean isUserInRole(String role)
  • Principal getUserPrincipal()

(Inpirationen till att skriva om det här fick jag från Ramesh Nagappan på Sun som precis har bloggat om några av säkerhetsnyheterna i Java EE 6, bl a HttpServletRequest. Ramesh har en del intressant exempelkod i sitt blogginlägg.)

Inga kommentarer: