Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Проверка пароля,логина..


Автор: jmich 10.3.2008, 17:26
У меня есть сервлет, страница jsp и класс подключения к базе данных. 
На странице jsp вводим логин и пароль. Как сделать проверку пароля, логина и id в базе данных? Хочу идентификацию сделать по 3-м параметрам(пароль, логин и id)

 
jsp  
Код

<core:view>
    <html:form>
        
        <h1><html:outputText value="Base avec JSF(page2)" /></h1>
        
        <html:outputText value="Login : " /> 
        <html:inputText value="#{login}" />
        
        <html:outputText value="Mot de Passe : " /> 
        <html:inputSecret value="#{password}" />
        
    
    <html:commandButton action="registrer" value="Connecter" >
                    <core:param name="id" value="#{personne_id}" />
                    <core:param name="l" value="#{login}" />
                    <core:param name="p" value="#{password}" />
                        </html:commandButton>
    </html:form>
</core:view>



Код
public List<Personne> getPass() {
        Personne personne = null;
        List<Personne> pass = new ArrayList<Personne>();
        try {

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://gp:3306/maison";
            Connection con = DriverManager.getConnection(url, "root", "root");
            Statement statement = con.createStatement();

            // Exécution d'une requete ex1
            String requete3 = "SELECT login, password, personne_id FROM personne";
        
            // System.out.println(requete1);
            ResultSet resultset = statement.executeQuery(requete3);

            // Traitement des résultats
            while (resultset.next()) {
                personne = new Personne();
                personne.setLogin(resultset.getString("login"));
                personne.setPassword(resultset.getString("password"));
                personne.setPersonne_id(resultset.getString("personne_id"));
                pass.add(personne);
            }
            // fermeture de la connexion
            con.close();

        }

        catch (ClassNotFoundException e) {
            System.err.println("Erreur lors du chargement du pilote : " + e);
        } catch (SQLException sqle) {
            System.err.print("Erreur SQL : " + sqle);
        }
        return pass;
    }



Код

public class PasswordServlet  extends HttpServlet {

        private BaseContact basecontact;
        
         public void init()
         throws ServletException{
          basecontact = new BaseContact();}
          
        public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        

            String p = request.getParameter("p");
            String l = request.getParameter("l");
            String id = request.getParameter("id");
            
            
            List<Personne> pass = BaseContact.getBaseContact().getPass();
            HttpSession session = request.getSession();
            session.setAttribute("pass", pass); 

            RequestDispatcher rd =
                request.getRequestDispatcher("faces/basejsf2.jsp");
                rd.forward(request, response);

        }
    }
    


Автор: v2v 10.3.2008, 17:36
а чего создал тему в разделе j2me ??
Цитата(jmich @  10.3.2008,  17:26 Найти цитируемый пост)
Хочу идентификацию сделать по 3-м параметрам(пароль, логин и id)

делаешь к базе запрос с указанным логином, паролем, ид : если вернуло одну запись : авторизация пройдена, нет - доступ запрещён.

Автор: jmich 10.3.2008, 17:38
А на примере можно? 

PS Да я уже написала модератору, чтобы переместили, ошибочка вышла.

Автор: jmich 10.3.2008, 18:23

нет вы меня не поняли, мне нужно на странице jsp ввести пароль и логин, потом эти параметры передаю сервлету для проверки существуют ли такие в базе данных. Если да , то сервлет возвращает новую страницу jsp, если нет остается та же страница.

Автор: v2v 10.3.2008, 19:16
ну стандартная задача.
вместо getPass пишешь метод checkUser куда передаёшь логин , пароль , ид .
В методе делаешь запрос 
Код

"SELECT login, password, personne_id FROM personne WHERE login='"+login_column+"' and password" .....  и т.д.

далее анализируешь респонс и делаешь редирект на другую страницу или открываешь эту же.

Автор: VOS 11.3.2008, 12:30
Вариант, предложенный  v2v годится в качестве академического примера, 
но в реальной жизни его надо использовать крайне осторожно.  
Например, если введенный пользователем логин
будет такой: 
1' or 1=1 or 0=0
а пароль любой, например 555
то результирующий SQL запрос примет вид:

"SELECT login, password, personne_id FROM personne WHERE login='1' or 1=1 or 0=0 and password='555' "

этот запрос будет выполнен успешно и Вам вероятно удастся зайти в систему не зная логина или пароля.
Это простой вариант, есть и другие, более изощренные способы атаки.
 
Лучше вызывать хранимую процедуру, или использовать переменные привязки/параметризированные запросы.
Т.е. очень опасно  динамически создавать строку запроса на основе данных, которые вводит пользователь

Автор: W0LF 11.3.2008, 13:42
в jdbc например юзай PreparedStatement или экранируй все кавычки одинарные smile

Автор: v2v 11.3.2008, 14:08
sql иньекция ... да это проблема ) .

Автор: jmich 11.3.2008, 15:01
я сделала так, но еще не проверила работает или нет...
правильно ли так? 
Код


private Object personne;
    public Object getPersonne (){
         String nom = "nom";
         String prenom = "prenom";
         String age = "age";
         String personne_id = "personne_id";
         String login = "login";
         String password = "password";

    try {

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://gp:3306/maison";
            Connection con = DriverManager.getConnection(url, "root", "root");
            Statement statement = con.createStatement();

            // Exécution d'une requete ex1
            String requete3 = "SELECT nom, prenom, age, login, password, personne_id FROM personne WHERE nom="+nom+" and prenom="+prenom+" and age='"+age+"' and login='"+login+"' and password='"+password+"' and personne_id="+personne_id+"";
            // System.out.println(requete1);
            ResultSet resultset = statement.executeQuery(requete3);

            // Traitement des résultats
            if (resultset.next()) {
                Personne personne = new Personne();
                    personne.setNom(resultset.getString("nom"));
                    personne.setPrenom(resultset.getString("prenom"));
                    personne.setAge(resultset.getString("age"));
                    personne.setLogin(resultset.getString("login"));
                    personne.setPassword(resultset.getString("password"));
                    personne.setPersonne_id(resultset.getString("personne_id"));
                
            }
            // fermeture de la connexion
            con.close();
        }
        catch (ClassNotFoundException e) {
            System.err.println("Erreur lors du chargement du pilote : " + e);
        } catch (SQLException sqle) {
            System.err.print("Erreur SQL : " + sqle);
        }
    return personne;
        
    }


Автор: jmich 11.3.2008, 17:54
Код
public Object personne;
   public Object getPersonne (){
    try {
 
           Class.forName("com.mysql.jdbc.Driver");
 
           String url = "jdbc:mysql://gp:3306/maison";
           Connection con = DriverManager.getConnection(url, "root", "root");
           Statement statement = con.createStatement();
 
           // Exécution d'une requete ex3
           String requete3 = "SELECT login,password,nom,prenom,age FROM personne WHERE personne_id =personne_id and login=login and password=password";
 
           //System.out.println(requete3);
           ResultSet resultset = statement.executeQuery(requete3);
 
           // Traitement des résultats
           if (resultset.next()) {
               Personne personne = new Personne();
                   personne.setNom(resultset.getString("nom"));
                   personne.setPrenom(resultset.getString("prenom"));
                   personne.setAge(resultset.getString("age"));
                   personne.setLogin(resultset.getString("login"));
                   personne.setPassword(resultset.getString("password"));
                   System.out.println(resultset.getString("age") + " " + resultset.getString("nom")
                           + " " + resultset.getString("prenom")+ " " + resultset.getString("login")
                           + " " + resultset.getString("password"));
            }
           // fermeture de la connexion
           con.close();
       }
       catch (ClassNotFoundException e) {
           System.err.println("Erreur lors du chargement du pilote : " + e);
       } catch (SQLException sqle) {
           System.err.print("Erreur SQL : " + sqle);
       }
   return personne;
   }


почему не компилирует, в чем ошибка?


Автор: AntonSaburov 11.3.2008, 18:15
Хорошо бы сообщение об ошибке все-таки писать. А то рыскать по всему коду и запускать его лениво smile

Автор: jmich 11.3.2008, 18:25
нет никаких сообщений об ошибке :(

если сервлет забирает параметры от jsp (пароль, логин, ид) 
    String p = request.getParameter("p");
    String l = request.getParameter("l");
    String idi = request.getParameter("id");

как мне их получить здесь ? 


Код

 public Object personne;
    public Object getPersonne (){
      
    try {

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://gp:3306/maison";
            Connection con = DriverManager.getConnection(url, "root", "root");
            Statement statement = con.createStatement();

            // Exécution d'une requete ex3
            String requete3 = "SELECT login,password,nom,prenom,age FROM personne WHERE personne_id =personne_id and login=login and password=password";

            //System.out.println(requete3);
            ResultSet resultset = statement.executeQuery(requete3);

            // Traitement des résultats
            if (resultset.next()) {
                Personne personne = new Personne();
                    personne.setNom(resultset.getString("nom"));
                    personne.setPrenom(resultset.getString("prenom"));
                    personne.setAge(resultset.getString("age"));
                    personne.setLogin(resultset.getString("login"));
                    personne.setPassword(resultset.getString("password"));
                    System.out.println(resultset.getString("age") + " " + resultset.getString("nom")
                            + " " + resultset.getString("prenom")+ " " + resultset.getString("login")
                            + " " + resultset.getString("password")); 
                                        
            }
            // fermeture de la connexion
            con.close();
        }
        catch (ClassNotFoundException e) {
            System.err.println("Erreur lors du chargement du pilote : " + e);
        } catch (SQLException sqle) {
            System.err.print("Erreur SQL : " + sqle);
        }
    return personne;
    }

Автор: ecologist 12.3.2008, 10:28
Ну видимо как-то передать из сервлета в экземпляр объекта. Я чтото не врубаюсь в проблему - ну есть сервлет. Так и вызывай из него свой объект с нужными параметрами. И работай на здоровье.

Автор: mbasil 12.3.2008, 14:27
Почему бы не использовать BASIC аутентификацию, то есть средствами сервера. 
Потому как, если выполнять собственную аутентификацию, то теряем
возможность декларативного управления безопасностью. Можно для
аутентификации, например, использовать такой фильтр (пример взят у SUN):

Код

package filters;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import sun.misc.BASE64Decoder;

public class LoginFilter implements Filter {

  private FilterConfig config = null;

  public void init(FilterConfig config) {
    this.config = config;
  }

  public void doFilter(ServletRequest _request,
                       ServletResponse _response,
               FilterChain chain)
          throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) _request;
    HttpServletResponse response = (HttpServletResponse) _response;
    ServletContext context = config.getServletContext();

    String user = null;
    HttpSession session = request.getSession();
    if( session != null ) {
           user = (String) session.getAttribute("USERNAME");
     }
    // Check if the user has already authenticated?
    if ( user != null ) {  // Авторизация выполнена, обрабатываем запрос
     
             chain.doFilter( request, response );
    } else {

        // Check if browser is sending the user's credentials
        String credentials = request.getHeader( "Authorization" );

        if ( credentials != null ) {

            // Retrieve the credentials from the header string
            credentials = credentials.substring( 6 );
            // context.log( "<-----> Credentials = " + credentials );

            // Decode the username:password string
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] data = decoder.decodeBuffer( credentials );
            String pair = new String( data );

            // Retrieve the username portion of the credentials
            int indx = pair.indexOf(':');
            String username = pair.substring( 0, indx );
            // String password = pair.substring( indx+1 );
            // context.log("<---->"+username+"<---->"+password+"<---->");

            session.setAttribute( "USERNAME", username );

            // And then proceed with the request
            chain.doFilter( request, response );

         } else {    // Send the login challenge

            // context.log("<-----> Sending the challenge <----->");
            response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
            response.setHeader("WWW-Authenticate", "Basic realm=<Имя вашей realm>");
         }
    }
  }
  public void destroy() {
    // do nothing
  }

}


Добавлено через 10 минут и 55 секунд
Кстати проверку в базе можете делать прямо из фильтра,
хотя это нехорошо - надо все-таки начать работать с пулами
подключений и источниками данных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)