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.)