2014-05-04 6 views
0

Je développe une application Java EE simple, en utilisant des serlvets jsp simples ainsi qu'avec les classes POJO et le support DAO. Quelle est la meilleure stratégie pour implémenter le contrôle d'accès ici.Contrôle d'accès en Java EE

J'ai d'abord pensé à utiliser un filter mais je ne suis pas tout à fait sûr de son utilisation, donc existe-t-il un moyen programmatique simple que je peux appliquer la même chose, je veux dire par l'utilisation du fichier properties ou autre approche?

Aussi je voudrais garder mon application poids léger. Alors s'il vous plaît suggérer les solutions pour le même? Merci d'avance!

Répondre

1

Fondamentalement ACL est implémentée dans Java EE en utilisant @DeclareRoles et @RolesAllowed annotation sur la classe de bean de session ou ses méthodes pour p sécurité rogrammatique. Vous pouvez également utiliser un élément dans votre descripteur de déploiement (web.xml) décrivant vos rôles et votre autorisation pour la sécurité décalée.

Voici exampple de Java EE tutorial pour la sécurité programmatique

package converter.ejb; 

    import java.math.BigDecimal; 
    import javax.ejb.Stateless; 
    import java.security.Principal; 
    import javax.annotation.Resource; 
    import javax.ejb.SessionContext; 
    import javax.annotation.security.DeclareRoles; 
    import javax.annotation.security.RolesAllowed; 

     @Stateless() 
     @DeclareRoles("TutorialUser") 
     public class ConverterBean{ 

       @Resource SessionContext ctx; 
       private BigDecimal yenRate = new BigDecimal("89.5094"); 
       private BigDecimal euroRate = new BigDecimal("0.0081"); 

       @RolesAllowed("TutorialUser") 
       public BigDecimal dollarToYen(BigDecimal dollars) { 
        BigDecimal result = new BigDecimal("0.0"); 
        Principal callerPrincipal = ctx.getCallerPrincipal(); 
        if (ctx.isCallerInRole("TutorialUser")) { 
         result = dollars.multiply(yenRate); 
         return result.setScale(2, BigDecimal.ROUND_UP); 
        } else { 
         return result.setScale(2, BigDecimal.ROUND_UP); 
        } 
       } 

       @RolesAllowed("TutorialUser") 
       public BigDecimal yenToEuro(BigDecimal yen) { 
        BigDecimal result = new BigDecimal("0.0"); 
        Principal callerPrincipal = ctx.getCallerPrincipal(); 
        if (ctx.isCallerInRole("TutorialUser")) { 
         result = yen.multiply(euroRate); 
         return result.setScale(2, BigDecimal.ROUND_UP); 
        } else { 
         return result.setScale(2, BigDecimal.ROUND_UP); 
        } 
       } 
      } 

Vous pouvez aussi le faire dans vos servlets en utilisant la connexion « HttpServletRequest, et l'authentification des méthodes fermeture de session pour l'authentification et utiliser getUserPrincipal et isUserInRole pour ACL. Ensuite, vous devrez ajouter à la description de votre servlet dans le fichier web.xml pour référencer les rôles déclarés dans les éléments du fichier web.xml. Voici un exemple de Java EE turorial pour la partie ACL.

package enterprise.programmatic_login; 

import java.io.*; 
import java.net.*; 
import javax.annotation.security.DeclareRoles; 
import javax.servlet.*; 
import javax.servlet.http.*; 

@DeclareRoles("javaee6user") 
public class LoginServlet extends HttpServlet { 

    /** 
    * Processes requests for both HTTP GET and POST methods. 
    * @param request servlet request 
    * @param response servlet response 
    */ 
    protected void processRequest(HttpServletRequest request, 
       HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      String userName = request.getParameter("txtUserName"); 
      String password = request.getParameter("txtPassword"); 

      out.println("Before Login" + "<br><br>"); 
      out.println("IsUserInRole?.." 
         + request.isUserInRole("javaee6user")+"<br>"); 
      out.println("getRemoteUser?.." + request.getRemoteUser()+"<br>"); 
      out.println("getUserPrincipal?.." 
         + request.getUserPrincipal()+"<br>"); 
      out.println("getAuthType?.." + request.getAuthType()+"<br><br>"); 

      try { 
       request.login(userName, password); 
      } catch(ServletException ex) { 
       out.println("Login Failed with a ServletException.." 
        + ex.getMessage()); 
       return; 
      } 
      out.println("After Login..."+"<br><br>"); 
      out.println("IsUserInRole?.." 
         + request.isUserInRole("javaee6user")+"<br>"); 
      out.println("getRemoteUser?.." + request.getRemoteUser()+"<br>"); 
      out.println("getUserPrincipal?.." 
         + request.getUserPrincipal()+"<br>"); 
      out.println("getAuthType?.." + request.getAuthType()+"<br><br>"); 

      request.logout(); 
      out.println("After Logout..."+"<br><br>"); 
      out.println("IsUserInRole?.." 
         + request.isUserInRole("javaee6user")+"<br>"); 
      out.println("getRemoteUser?.." + request.getRemoteUser()+"<br>"); 
      out.println("getUserPrincipal?.." 
         + request.getUserPrincipal()+"<br>"); 
      out.println("getAuthType?.." + request.getAuthType()+"<br>"); 
     } finally { 
      out.close(); 
     } 
    } 

} 

Voir les liens fournis du tutoriel Java EE pour des exemples plus complets et des explications.

1

Si vous n'utilisez pas d'API (comme spring security ou apache shiro), les filtres Web sont ce dont vous avez besoin.

Dans votre implémentation de filtre, si vous souhaitez accorder l'accès, il suffit d'appeler

chain.doFilter(request, response); 

qui traitera la demande normalement, sinon, de rediriger l'utilisateur vers une autre page en utilisant

response.sendRedirect(Url); 

est un bonne option