LoginPruefer.java
001 /*
002  * Created on 28.02.2004
003  */
004 package de.fub.tip.datenbank.logik;
005 
006 import java.sql.Connection;
007 import java.sql.PreparedStatement;
008 import java.sql.ResultSet;
009 import java.sql.SQLException;
010 
011 import javax.sql.DataSource;
012 
013 import org.apache.log4j.Logger;
014 
015 import de.fub.tip.datenanzeige.ormapper.UserdataVO;
016 import de.fub.tip.datenbank.factory.LogicObject;
017 import de.fub.tip.exceptions.UserNotFoundException;
018 
019 /**
020  * Sinn: stellt eine Verbindung zur DB her und <br>übernimmt die
021  * Prüfung des Logins, wobei ein Userdata-ViewObject erzeugt wird,<br>
022  * auf dem die Oberfläche arbeiten kann.
023  <br>
024  @author hirsch, 28.02.2004
025  @version 2004-05-03
026  * $Id: LoginPruefer.java,v 1.18 2004/05/03 07:55:12 hirsch Exp $
027  
028  @see de.fub.tip.datenanzeige.ormapper.UserdataVO
029  *
030  <hr> 
031  * Tipp aus WWW:<br>
032  * You can check if someone is logged in by checking if <br>
033  <code>request.getUserPrincipal()</code> returns null or not.
034  <hr>
035  */
036 
037 public class LoginPruefer implements LogicObject {
038   /** Logger zur Fehlersuche */
039   private static Logger logger = Logger.getLogger(LoginPruefer.class);
040   /** Datenquelle mit der der <code>LoginPruefer</code> arbeitet */
041   private DataSource datasource = null;
042 
043   /**
044    * Standardkonstruktor, der einen LoginDatenPrüfer erzeugt  
045    @param datasource Datenquelle
046    */
047   public LoginPruefer(DataSource datasource) {
048     this.datasource = datasource;
049     logger.info("LoginPruefer initialized.");
050   // end of Konstruktor
051 
052   /**
053    * hier geschieht die eigentliche LoginÜberprüfung 
054    <br>
055    * Das zurückgegebene UserdataVO enthält aus Sicherheitsgründen
056    <b>KEIN</b> Passwort. Dadurch kann man das Objekt getrost 
057    * in der Session speichern, ohne die Userdaten zu kompromitieren.
058    <br>
059    <b>ACHTUNG!</b><br>
060    * In <code>PreparedStatements</code> niemals das Fragezeichen 
061    * in Delimiter setzen! - '?' erzeugt eine Ausnahme, die besagt, 
062    * dass die Parametergrößen ungültig sind....
063    <br>nur ? allein und alles geht!
064    <br>
065    @param username übergebener Username
066    @param passwort übergebenes Passwort
067    
068    @return UserdataVO als Kapselung des in der DB enthaltenen Users
069    
070    @throws UserNotFound wenn Anmeldedaten ungültig sind
071    */
072   public UserdataVO checkValidUser(String username, String passwort
073     throws UserNotFoundException, SQLException {
074     
075       UserdataVO ergebnis = new UserdataVO();
076 
077       Connection con = this.datasource.getConnection();
078       PreparedStatement prepStatement = con.prepareStatement(
079         "SELECT * FROM userdata u " +
080         "WHERE u.login=? AND u.passwort = ?");
081     
082       // Parameter laden
083       prepStatement.setString(1, username);
084       prepStatement.setString(2, passwort);
085       
086       ResultSet rs = prepStatement.executeQuery();
087 
088       ifrs != null && rs.next()) {
089         // Ergebnis in UserdataVO speichern 
090         ergebnis.setId(new Integer(rs.getInt("udid")));
091         ergebnis.setName(rs.getString("name"));
092         ergebnis.setLast_name(rs.getString("last_name"));
093         ergebnis.setLogin(rs.getString("login"));
094         ergebnis.setPasswort("bogusPassword");
095         // standardmässig kommt hier das ISO-Format: YYYY-MM-DD
096         ergebnis.setAnmeldedatum(
097                 rs.getDate("anmeldedatum").toString());
098 
099         logger.info("LoginPruefer für USERDATAVO["+
100                 ergebnis.getName()+"]");
101         ergebnis.logObject(logger);
102 
103           // Schliessen/Freigabe der Datenbankverbindung
104           try {
105             if(con != nullcon.close();
106             logger.debug("LoginPruefer: DB-Con geschlossen.");
107           catch (SQLException e) {
108             logger.debug("LoginPruefer: " +
109               "geschachtelte Ausnahme beim Schliessen der " +
110               "DB-Verbindung.");
111           // end of try
112 
113         return ergebnis;        
114       else {
115         logger.error("LoginPruefer.UserNotFound - " +
116             "LoginPruefer.checkValidUser("+ username +"," 
117             passwort+ ")");
118 
119           // Schliessen/Freigabe der Datenbankverbindung
120           try {
121             if(con != nullcon.close();
122             logger.debug("LoginPruefer: DB-Con geschlossen.");
123           catch (SQLException e) {
124             logger.debug("LoginPruefer: " +
125               "geschachtelte Ausnahme beim Schliessen der " +
126               "DB-Verbindung.");
127           // end of try
128              
129         throw new UserNotFoundException(
130              "LoginPruefer.UserNotFound - " +
131           "checkValidUser("+username+","+passwort+")")
132       // end if
133   // end of checkValidUser
134 // end of class