37 votes

La Sécurité de base de JSF

Je voudrais voir une simple Application de Connexion, pas aussi simple que cela cependant.

Ce que j'aimerais obtenir une compréhension sur la façon dont JSF fonctionne, j'ai développé un grand nombre de ASP.NET où vous avez le code derrière et où vous pouvez simplement vérifier si une session a été créé lors de la Connexion.

Une solution similaire dans JSF serait génial.

C'est en gros ce que je veux réaliser:

  • Page de connexion
  • SI OK
    • Créer une session et le retour de la "réussite"
  • SI L'ÉCHEC
    • de retour de "l'échec"

(Le "succès" et l'échec sont mappés à faces-config.xml)

À la réussite-page, je veux être Certain que l'utilisateur est connecté, donc de ne Pas être capable de naviguer à "la réussite.jspx" si vous n'avez pas la bonne session.

47voto

McDowell Points 62645

Il n'est pas inhérente à la fonctionnalité d'authentification à base JSF au-delà d'être capable d'utiliser des choses comme composant rendered d'attributs orientés vers la sécurité basée sur les rôles.

Par défaut, une application JSF s'appuie sur la même container-managed mécanismes de sécurité comme le composant web qui le contient (JEE5 tutoriel). 3ème partie des cadres comme la Couture peut fournir des alternatives.

Si vous souhaitez ajouter votre propre application de sécurité, un filtre de servlet est l'un des plus simples mécanismes.

Ce filtre protège les ressources en vertu de l' restricted répertoire tel que défini dans l' web.xml:

  <filter>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>restricted.AuthenticationFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/restricted/*</url-pattern>
  </filter-mapping>

La classe de filtre de mise en œuvre:

public class AuthenticationFilter implements Filter {
  private FilterConfig config;

  public void doFilter(ServletRequest req, ServletResponse resp,
      FilterChain chain) throws IOException, ServletException {
    if (((HttpServletRequest) req).getSession().getAttribute(
        AuthenticationBean.AUTH_KEY) == null) {
      ((HttpServletResponse) resp).sendRedirect("../restricted_login.faces");
    } else {
      chain.doFilter(req, resp);
    }
  }

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

  public void destroy() {
    config = null;
  }
}

Une connexion bean défini en faces-config.xml:

public class AuthenticationBean {
  public static final String AUTH_KEY = "app.user.name";

  private String name;
  public String getName() { return name; }
  public void setName(String name) { this.name = name; }

  public boolean isLoggedIn() {
    return FacesContext.getCurrentInstance().getExternalContext()
        .getSessionMap().get(AUTH_KEY) != null;
  }

  public String login() {
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
        AUTH_KEY, name);
    return "secret";
  }

  public String logout() {
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
        .remove(AUTH_KEY);
    return null;
  }
}

La JSF formulaire de connexion dans l' restricted_login.jsp page:

  <f:view>
    <p><a href="restricted/secret.faces">try to go to secret
    page</a></p>
    <h:form>
    Username:
    <h:panelGroup rendered="#{not authenticationBean.loggedIn}">
        <h:inputText value="#{authenticationBean.name}" />
        <h:commandButton value="login"
          action="#{authenticationBean.login}" />
      </h:panelGroup>
      <h:commandButton value="logout"
        action="#{authenticationBean.logout}"
        rendered="#{authenticationBean.loggedIn}" />
    </h:form>
  </f:view>

(L'URL de redirection/mécanisme a été choisi pour des raisons de concision, plutôt que toute sorte de bonnes pratiques; voir la Servlet API pour plus d'options.)

4voto

Tomas F Points 1027

Si vous êtes prêt à essayer un peu plus avancé approche, alors je suggère à la recherche du printemps-sécurité+JSF. Il fonctionne comme un charme.

Vous pouvez écrire votre demande comme si elle n'était pas en sécurité, et puis il suffit de configurer les zones qui doivent être protégées à l'aide d'aspects.

Printemps de sécurité: http://static.springsource.org/spring-security/site/

Un Tutoriel: http://ocpsoft.com/java/acegi-spring-security-jsf-login-page/

3voto

gordan Points 31

La meilleure façon de le faire serait d'utiliser gérée par le conteneur de sécurité.

Voici un tutoriel sur la façon de l'accomplir avec glassfish et jsf.

2voto

DougMH Points 59

Si vous utilisez des modèles, j'ai trouvé, vous n'avez pas vraiment besoin d'un filtre.

index.jsp

<jsp:forward page="startup.faces"></jsp:forward>

de démarrage.xhtml (.les visages), n'a pas réellement essayez d'afficher un écran, il appelle le javascript startupSubmit() sur la charge et qui clique sur le bouton. Cela envoie le flux directement à la méthode start() dans StartupBean.java.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0     Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
.
.
 <script type="text/javascript">
 function startupSubmit() {
  **document.getElementById('startupForm:startupBtn').click();**
 }
 </script>
 <h:body onload="startupSubmit()">
 <h:form id="startupForm">
 <p:commandButton id="startupBtn" value="" action="#{startupBean.start}" ajax="false" />  
 </h:form>
 </h:body>
</html>

StartupBean.java (ne fait pas partie du modèle.xhtml ci-dessous). La méthode start() dans StartupBean définit une variable appelée autorisé à true (la valeur par défaut est false), puis saute à la première.xhtml. Vous pouvez utiliser tous les critères que vous aurez envie de déterminer si autorisé est fixé à true... comme login critères.

package gov.irs.eservices.managementBeans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name="startupBean")
@SessionScoped
public class StartupBean {

private boolean authorized;

public StartupBean() {
}

public String start() {
    **setAuthorized(true);**
    return "first";
}

public boolean isAuthorized() {
    return authorized;
}

public void setAuthorized(boolean authorized) {
    this.authorized = authorized;
}
}

de modèle.xhtml. Dans le modèle.xhtml, juste à l'intérieur de la forme, vous placez un h ou p: panelGrid et seulement le rendre si startupBean.autorisé est vrai. La seule façon, un utilisateur peut obtenir pour les pages contenues dans le modèle est si elles viennent à travers StartupBean.java d'abord.

<f:view>
<div id="container">
<h:form id="templateForm">
**<p:panelGrid rendered="#{startupBean.authorized}">**
    <div id="header">
        <ui:include src="header.xhtml" />
    </div>

    <div id="wrapper">
        <div id="firstId">
            <ui:insert name="first"></ui:insert>
        </div>
.
.  <!-- MORE PAGES -->
.
.
    </div>

    <div id="footer">
        <ui:include src="footer.xhtml" />
    </div>
</p:panelGrid>
</h:form>
</div>      
</f:view>

Donc, c'est ma solution. Je l'ai testé très bien et il semble bien fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X