IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

[Filtre de Servlet]Gerer les authorisations d'accès


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Par défaut [Filtre de Servlet]Gerer les authorisations d'accès
    J'ai pensé à realiser mes authorisations d'accès à l'aide d'un filtre de Servlet, qui pour chaque requète va analyser l'URI demandé et comparé avec celle qui lui sont authorisé en fonction de ses droits.

    Voici mon filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public void doFilter(ServletRequest req, ServletResponse res,
    		FilterChain chain) throws IOException, ServletException {
    		System.out.println("Youhou");
     
    		boolean status;
     
    		/*On verifie que l'user est authentifié (presence de son objet en Session)*/
    		HttpSession session = ((HttpServletRequest) req).getSession(false);
    		if (session == null || session.getAttribute("personne") == null);
    			envoiErreur.sendLoginError((HttpServletRequest)req,(HttpServletResponse)res,EnvoiErreur.SESSION_ERROR);
     
    		/*On recupère l'URI demandé*/
    		String URI = ((HttpServletRequest)req).getRequestURI();
     
    		//On teste si la variable personne qui doit être ds la session est un User ou un Admin
    		if(session.getAttribute("personne") instanceof User){
    			//Verifier si dans pages autorisé a User
    			status = isUserPage(URI);
    			if (!status)
    				envoiErreur.sendLoginError((HttpServletRequest)req,(HttpServletResponse)res,EnvoiErreur.INSCR_ERROR);
    		}
    		else if (session.getAttribute("personne") instanceof Admin) {
    			//Verifier si dans pages autorisé à Admin
    			status = isAdminPage(URI);
    			if (!status)
    				envoiErreur.sendLoginError((HttpServletRequest)req,(HttpServletResponse)res,EnvoiErreur.INSCR_ERROR);
    		}
    		chain.doFilter(req,res);
    	}
    Problèmes :

    en cas de reussite, la page demandé n'est jamais renvoyé, pourtant j'effectue bien le chain.doFilter() en fin de traitement ...

    en cas d'erreur, j'ai créer une classe envoiErreur qui est censé renvoyé une page d'erreur à l'utilisateur, mais cela ne marche pas et cela se fini en IllegalStateException ...

    La fonction de renvoi d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void sendLoginError(HttpServletRequest req, HttpServletResponse res, String errorType){
    		HttpSession s = req.getSession();
    		s.setAttribute("errorMessage",errorType);
    		try {
    			res.sendRedirect(res.encodeRedirectURL("pages/login.html"));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}	
    	}
    et l'exception retourné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    java.lang.IllegalStateException
    	at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:432)
    	at controleur.EnvoiErreur.sendLoginError(EnvoiErreur.java:30)
    	at controleur.ProtectAccess.doFilter(ProtectAccess.java:88)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    	at java.lang.Thread.run(Unknown Source)
    Voyez vous des éléments susceptible d'être responsable de mes problèmes ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Par défaut
    Petit up, quelqu'un pourrait t'il m'aider pour reprendre mon algo de vérification d'authentification.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Par défaut
    Bon j'ai repris l'algo, et le problème que je rencontre est qu'en cas de non autorisation, la page d'erreur n'est pas renvoyé mais je tourne en boucle dans le filtre

    Voici le code de mon filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public void doFilter(ServletRequest req, ServletResponse res,
    		FilterChain chain) throws IOException, ServletException {
    		System.out.println("Youhou");
    		HttpSession session = null;
    		try {
     
    			/*On verifie que l'user est authentifié (presence de son objet en Session)*/
    			session = haveSession((HttpServletRequest) req);
    			/*On recupère l'URI demandé*/
    			String URI = ((HttpServletRequest)req).getRequestURI();
     
    			//On teste si la variable personne qui doit être ds la session est un User ou un Admin
    			if(session.getAttribute("personne") instanceof User){
    				isUserPage(URI);
    			}
    			else if (session.getAttribute("personne") instanceof Admin) {
    				isAdminPage(URI);
    			}	
    			chain.doFilter(req,res);
    		}
    		catch (IllegalArgumentException e)
    		{
    			envoiErreur.sendLoginError((HttpServletRequest)req,(HttpServletResponse)res,EnvoiErreur.SESSION_ERROR);
    		}
    		catch (IdentificationException e)
    		{
    			envoiErreur.sendError((HttpServletRequest)req,(HttpServletResponse)res,EnvoiErreur.RESTRICT_ERROR,null);
    		}
     
    	}
     
    private void isUserPage(String uri){
    		boolean isAuthorized = false;
    		for(int i=0;i<restrictedUserPages.length;i++){
    			if (uri.equals(BASE_URI + USER_REP + restrictedUserPages[i]))
    				isAuthorized = true;
    		}
    		if (!isAuthorized)
    			throw new IllegalArgumentException();
    	}
     
    	private void isAdminPage(String uri){
    		boolean isAuthorized = false;
    		System.out.println(uri);
    		for(int i=0;i<restrictedAdminPages.length;i++){
    			System.out.println(BASE_URI + USER_REP + restrictedAdminPages[i]);
    			if (uri.equals(BASE_URI + USER_REP + restrictedAdminPages[i]))
    				isAuthorized = true;
    		}
    		if (!isAuthorized)
    			throw new IllegalArgumentException();
    	}
     
    	private HttpSession haveSession(HttpServletRequest req) throws IdentificationException {
    		HttpSession session =  req.getSession(false);
    			if (session == null || session.getAttribute("personne") == null)
    				throw new IdentificationException();
    			return session;
    	}
    La methode d'envoi d'erreur est toujours la même, je ne comprend pas le phénomène qui se produit.

Discussions similaires

  1. [V7] Gérer les droits d'acces des commerciaux
    Par Simon1992 dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 13/08/2014, 15h32
  2. [Filtre de Servlet] Accès à un dossier
    Par K-Kaï dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 04/07/2006, 15h37
  3. [9i][packages] gerer les droit d'acces
    Par hoaxpunk dans le forum Oracle
    Réponses: 3
    Dernier message: 02/02/2006, 14h58
  4. [JUnit] Pour tester les methodes d'acces à une sgdb
    Par yanis97 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 15/04/2004, 15h55
  5. [syntaxe] Gerer les variables dans une requete
    Par rastapopulos dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/04/2003, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo