Bom, uma das perguntas mais frequentes de quem esta começando a estudar JSF é como implementar um Login, e esta foi uma das perguntas mais frequentes que vi no GUJ e em comentários aqui no blog também …
Antes de começar, quem quiser usar JSF com JPA é só dar uma olhada neste post que escrevi a algum tempo.
Agora vamos dar uma olhada rápida em algumas formas de implementar login com JSF.
A primeira abordagem é uma implementação manual, que nesta versão só verifica se o usuário ja esta logado, mas é possível estende-la facilmente para utilizar grupos.
Primeiro vamos começar com a configuração do web.xml …
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.SecurityException</exception-type>
<location>/login.jsf</location>
</error-page>
</web-app>
Como podem ver, eu criei uma aplicação WEB com servlets 2.5, estou utilizando JSF 1.2, mas para este exemplo a versão não faz muita diferença, e configurei o servlet container para que no caso de uma java.lang.SecurityException ele redireccione para a página de login da aplicação.
Depois disto, vamos começar a escrever alguns beans, vou utilizar dois beans simples, um para gerenciar o login:
package br.com.urubatan.jsfjpasec;
public class Login {
private boolean loginOk;
private String userName;
private String password;
public boolean isLoginOk() {
return loginOk;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String validateLogin(){
if(userName!=null && password!=null && !userName.equalsIgnoreCase(password)){
loginOk = true;
return "secpage";
}else return "login";
}
}
É uma classe bastante simples, ele tem 3 propriedades, o nome e senha do usuário, e uma propriedade dizendo que o login esta OK, este é o ponto de extensão para adicionar suporte a grupos mais tarde se quiserem.
E este bean que vai conter todos os dados da aplicação (neste exemplo, dados estáticos), ele tem duas propriedades que possuem dados estáticos apenas para este exemplo, se quiserem utilizar JPA basta misturar com este exemplo ou com um destes.
package br.com.urubatan.jsfjpasec;
import java.util.List;
import java.util.ArrayList;
public class SomeData {
private List<String> data = new ArrayList<String>();
private List<String> securedData = new ArrayList<String>();
private boolean loginOk;
public SomeData() {
for(int i=0;i<10;i++){
data.add("Dados Simples " + i);
securedData.add("Dados Seguros " + i);
}
}
public void setLoginOk(boolean loginOk) {
this.loginOk = loginOk;
}
public List<String> getSecuredData() {
if(!loginOk)
throw new SecurityException();
return securedData;
}
public List<String> getData() {
return data;
}
}
Como podemos ver, ele possui apenas os getters dos dados, e o método de leitura dos dados seguros, verifica a propriedade loginOk que deve ter sido fornecida pelo bean de login, vamos configurar isto no faces-config.xml a seguir.
Caso o usuário não tenha se identificado ainda, apenas geramos uma SecurityException e o container cuida de mandar isto para a página de login, como foi configurado no web.xml.
Agora um pouco mais de XML, vamos configurar os navigation cases necessários para a aplicação e os relacionamentos entre os beans ja criados, no caso, configurar a propriedade loginOk do bean de dados com a mesma propriedade do bean de login.
<?xml version='1.0' encoding='UTF-8'?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>login</managed-bean-name>
<managed-bean-class>br.com.urubatan.jsfjpasec.Login</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>mdata</managed-bean-name>
<managed-bean-class>br.com.urubatan.jsfjpasec.SomeData</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>loginOk</property-name>
<property-class>java.lang.Boolean</property-class>
<value>#{login.loginOk}</value>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>/login.jsp</from-view-id>
<navigation-case>
<from-outcome>
login
</from-outcome>
<to-view-id>
/login.jsp
</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
<from-outcome>
secpage
</from-outcome>
<to-view-id>
/secureView.jsp
</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
</faces-config>
Os casos de navegação nesta aplicação bastante complexa são utilizados apenas pelo bean de login, no método que valida o login (baita validação, apenas verifica se foram informados um nome e uma senha e se os dois não são iguais, mas este é outro problema
)
Com isto toda a lógica necessária para a aplicação esta pronta, falta apenas criarmos as páginas utilizadas, então segue o código delas:
login.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<html>
<head><title>System Login</title></head>
<body>
<f:view> <h:form>
<h:panelGrid columns="2">
<h:outputLabel value="User Name" for="un"/>
<h:inputText id="un" value="#{login.userName}"/>
<h:outputLabel value="Password" for="pw"/>
<h:inputText id="pw" value="#{login.password}"/>
</h:panelGrid>
<h:commandButton value="Login" action="#{login.validateLogin}"/>
</h:form>
</f:view>
</body>
</html>
Como podemos ver é apenas uma página JSF simples com um formulário e dois campos, chamando o método vaidateLogin de um bean de nome login.
dataView.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<html>
<head><title>Unsecured Data Page</title></head>
<body>
<f:view>
<h:dataTable value="#{mdata.data}" var="v">
<h:column>
<f:facet name="header">
<h:outputText value="Data List"/>
</f:facet>
<h:outputText value="#{v}"/>
</h:column>
</h:dataTable>
<h:panelGrid columns="3">
<h:outputLink value="dataView.jsf">
<h:outputText value="Data that every one can access"/>
</h:outputLink>
<h:outputLink value="secureView.jsf">
<h:outputText value="Data that you can view after login"/>
</h:outputLink>
<h:outputLink value="login.jsf">
<h:outputText value="Login"/>
</h:outputLink>
</h:panelGrid>
</f:view>
</body>
</html>
Como podemos ver também é uma página bem simples, com apenas uma dataTable listando os dados da propriedade data de um bean de nome mdata.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<html>
<head><title>Secured Data Page</title></head>
<body>
<f:view>
<h:dataTable value="#{mdata.securedData}" var="v">
<h:column>
<f:facet name="header">
<h:outputText value="Data List"/>
</f:facet>
<h:outputText value="#{v}"/>
</h:column>
</h:dataTable>
<h:panelGrid columns="3">
<h:outputLink value="dataView.jsf">
<h:outputText value="Data that every one can access"/>
</h:outputLink>
<h:outputLink value="secureView.jsf">
<h:outputText value="Data that you can view after login"/>
</h:outputLink>
<h:outputLink value="login.jsf">
<h:outputText value="Login"/>
</h:outputLink>
</h:panelGrid>
</f:view>
</body>
</html>
por último temos a página index.jsp que apenas possui um link para a página dataView.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Entry Page</title></head>
<body>Entry Page, this could redirect to the JSF Index, but for now, click here: <a href="dataView.jsf">JSF Index</a>
</body>
</html>
com isto temos uma implementação bem simples de um login em uma aplicação JSF, bom para quem esta começando a estudar a tecnologia.
Como melhorias poderíamos mudar a propriedade loginOk para um Map<String,Boolean> tendo como chave os nomes dos possíveis grupos e como valores veradeiro se o usuário pertence aquele grupo.
Outra melhoria interessante seria utilizar um h:inputSecret para a senha em vez de um inputText como estou utilizando no exemplo.
Outra possível melhoria seria utilizar uma combinação de anotações e AOP como esta implementado no Spring-Annotations. (se quiserem posso postar outro dia um exemplo de implementação de segurança com o SA).
Uma outra possível alteração seria utilizar JAAS para a segurança declarativa e deixar isto por conta do container.
Agora algumas perguntas para vocês:
Acho que era isto, espero que o exemplo seja útil para alguém
PS.: para os que forem rodar a aplicação, são necessários apenas os jars: jstl.jar, jsf-api.jar e jsf-impl.jar (se forem utilizar a JSF-RI como eu).
Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!
isso tudo supostamente pra *incentivar* a usarem JSF?!
Sinceramente não achei estar incentivando …
JSF é uma boa solução que merece ser estudada, mas não é a bala de prata, ela se aplica a alguns casos, e eu ja utilizei em muitos projetos, mas não tenho utilizado no últimos …
Este post foi como eu comentei no inicio, a pedidos, tem vários comentários aqui pedindo um exemplo disto
Atualmente estou mais para incentivar o uso de Ruby On Rails
[...] continua en Urubatan traido usted por [...]
Interessante. Legal esse tipo de post com tutoriais…parabéns
Legal Urubatan…
estou começando a estudar JSF e estou gostando muito.
Fiquei com uma curiosidade. Você disse que já usou muito JSF e não tem utilizado ele nos últimos projetos, correto? Qual framework você está utilizando para desenvolver (em java) ultimamente?
Sempre achei você um fã de carteirinha do JSF…
abraços
Marcelo
Valeu! =)
Vou estudar isso hoje a tarde.. E que tal criptografia no persistence.xml? Um outro post? ashfiuashdfiuashdfuias
abraço. E obrigado pela atenção!
[...] aproveitar o post do Urubatan ensinando como fazer um login com JSF para explicar como delegar, para o container web, o serviço de autenticação e [...]
Um otimo exemplo para ver a complexidade para criar um simples login.. xmls, taglibs.. etc etc.. O Wicket é novo, mas promete.. Por que você realmente prefere JSF Urubatan? Eu entendo que ele faz parte da especificação, etc.. Tem implementações maduras.. Mas, e aí? Você gosta dessa abordagem?
[]
Fagner
[...] ja que fui criticado por “incentivar a utilização de JSF”, vou fazer mais alguns pequenos tutoriais de [...]
O que você achou do exemplo de login implementado usando o serviço de autenticação e autorização do container?
[],
AC
Achei muito bom o exemplo, só não utilizo JAAS com freqüência pela falta de flexibilidade
Por exemplo, é comum ter mais de dois campos na autenticação (além de usuário e senha, é comum um código de cliente ou algo do gênero)
E com JAAS não consigo implementar isto …
Marcelo, JSF é uma ótima tecnologia quando utilizada corretamente, mas como toda tecnologia, não é a solução para todos os seus problemas …
Para escolher o que vai ser utilizado em um projeto, preciso levam em conta diversos fatores, e por coincidência, JSF não fechou com nenhum projeto que implementei este ano (mesmo eu tendo passado 2 anos utilizando em todos os projetos que trabalhei até o final do ano passado)
quando vc tenta acessar secureView.jsf sem estar logado.. em vez de direcionar para a pagina de login.. ele da esse erro:
exception
javax.servlet.ServletException: /secureView.jsp(8,0) ‘#{mdata.securedData}’ Error reading ’securedData’ on type br.com.urubatan.jsfjpasec.SomeData
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
oque sera q pode ser?
aparentemente você ou esqueceu de configurar o web.xml
acredito que seja este o problema …
javax.servlet.ServletException
/login.jsf
esta igual ao seu (o do post).. para dar certo tive que fazer isso.. mais ficou sem logica nenhuma..
parece que a implementação de JSF que você esta utilizando, esta mascarando a SeurityException em uma ServletException …
Qual implementação você esta utilizando? a RI ou MyFaces? qual versão 1.1 ou 1.2?
jsf 1.2. richfaces, ajax4jsf
a e uma outra pergunta.. digamos que eu tenho uma pagina.. so escrita bem vindo usuario fother
como q eu faço pra que so quem logou possa ver.. sem usar scriptlets na jsp
fother, o JSF não passa por controller nenhum antes de renderizar a página, então não tem como fazer nada com qualquer página que não acesse dados de lugar nenhum …
o melhor que poderia ser feito é utilizar o atributo rendered dos objetos para não mostra-los na tela.
Olá, estou desenvolvendo uma aplicacao com JSF em que preciso listar noticias e quando clicar sobre o titulos delas abrir em uma outra pagina o conteudo da noticia. semelhante como temos em jornais na internet (uol, terra, etc… ) Estou cadastrando e listando as noticia como quero, so que naum sei como pegar a referencia da noticia que eu cliquei para poder exibir seu conteudo completo em outra pagina. Tem algum exemplo? se entendeu e poder me ajudar agardeco bastante.
Fala cara,
Curti mt o exemplo. Quanto a parte de seguranca eu to pesquisando como funcionaria via PhaseListeners. Voce sabe de algum artigo/link q fale sobre isso?vlw
Tem aqui na página de publicações do blog, no exemplo de um curso realizado em pato branco … (não lembro se na página de publicações ou em um post sobre o curso
)
Ótimo exemplo
[...] Versão em portugues aqui [...]
Urubatan, estou com o mesmo problema que o fother, relatou.
A minha implementação é basicamente a mesma, só é myfaces (em vez de richfaces).
Pode me dar uma mão?
Pelas mensagens de erro parece que o problema é com o ajx4jsf.
javax.servlet.ServletException: Cannot get value for expression ‘#{mdata.dadosSeguros}’
javax.faces.webapp.FacesServlet.service(FacesServlet.java:154)
org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:97)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Ola amigo, parabéns pelo blog e pelo exemplo.
Seguinte, estou tentando “rodar” aqui, mas esta aparecendo o seguinte erro:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 10 in the jsp file: /dataView.jsp
The method setVar(String) in the type DataTableTag is not applicable for the arguments (JspValueExpression)
Faz alguma idéia do que é e como resolver? Ja testei o forEach, mas o erro continua.
Estou tendo o mesmo problema… conseguiu resolver?
Weliton, parece que é algum problema entre a versão do JSF e do JSP que tu ta usando, tenta atualizar o JSF pra 1.2 que deve resolver …
Luiz, parece que faltou configurar o faces-config.xml …
Urubatan,
Pq da exceção quando eu declaro uma propriedade como boolean no meu Valued Object e tento mostra-la com a tag ?
Exceção:
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
org.apache.jasper.el.JspPropertyNotFoundException: /jsf/adm/controle_usuario.jsp(126,11) ‘#{users.flagAtivo}’ Property ‘flagAtivo’ not readable on type boolean
at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:104)
at javax.faces.component.UIOutput.getValue(UIOutput.java:184)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:201)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:284)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:154)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:849)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:242)
at com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:312)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:133)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:825)
at org.ajax4jsf.framework.renderer.RendererBase.renderChild(RendererBase.java:282)
at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:159)
at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:97)
at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:150)
at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:97)
at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:150)
at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:125)
at org.ajax4jsf.framework.ajax.AjaxViewRoot.encodeAjax(AjaxViewRoot.java:549)
at org.ajax4jsf.framework.ajax.AjaxViewRoot$4.invokeRoot(AjaxViewRoot.java:380)
at org.ajax4jsf.framework.ajax.JsfOneOneInvoker.invokeOnRegionOrRoot(JsfOneOneInvoker.java:53)
at org.ajax4jsf.framework.ajax.AjaxContext.invokeOnRegionOrRoot(AjaxContext.java:191)
at org.ajax4jsf.framework.ajax.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:397)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:256)
at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:187)
at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:233)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at br.com.sofisa.pcfi.filter.ControlFilter.doFilter(ControlFilter.java:34)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)
?
Não estou conseguindo sucesso para rodar este exemplo.
Colocar as páginas em .jsp e configurar sendo .jsf não tem problema?
Qual a melhor maneira para aplicar isso para várias páginas com a menor replicação de código possivel?
Abraço
Daniel
PS. Valeu pelos posts, tem ajudado bastante a galera.
Urubatan, trabalhamos cm jsf a quase 2 anos e chegamos num ponto crucial de um sistema onde precisamos carregar combos em diversas telas. carregamos as combos com selectItens, então eis a pergunta : tenho um managed bean que tem 1 arraylist genérico de uma entidade, temos mais 2 atributos long, esse bean é responsável por uma tela de cadastro A. temos outro cadastro B onde temos outro bean também e precisamos carregar uma combo com uma lista genérica da tela de cadastro A (simplificando bem o problema). a questão é se no momento que chamarmos o método que carrega essa lista da entidade A na tela da entidade B como o jsf se comportaria em relação a todos os objetos no bean A, já que cada vez que chamo um managed bean na tela ele instância o managed bean em memória.
Se esse é o exemplo simples usando JSF, imagina o exemplo escroto!
heuehueheue
não consegui fazer as config do xml.
[]’s
Luiz Gustavo, respondendo a sua pergunta em
Não estou conseguindo sucesso para rodar este exemplo.
Colocar as páginas em .jsp e configurar sendo .jsf não tem problema?
Tem problema sim… pra conseguir rodar aqui, tive que trocar todas as referências de jsf para jsp em todos os arquivos…
Espero ter ajudado
abraços
MEU SE É FEIO EM CARA TU PARECE UM BOIZAO RSRSRS KKKKKKKKKKKKKKKKKK
Olá URubatan, bacana o post pra quem está começando, como é o meu caso, como seria a implementação com grupos de acesso? Como administrador, usuário e tal tal tal??? vlw
[...] ser melhorado, inclusive tem algumas sugest?es de melhora no final do post, qual a sua sugest??o?http://www.urubatan.com.br/2007/08/14/implementando-login-com-jsf-exemplo-simples/Eclipse Plugin Central :: View topic - New JSF Login Demo TutorialPost subject: New jsf login Demo [...]
porque esta informação está em inglês?
[...] [...]
Adicionando o logout para o exemplo:
1) Na classe Login.java adicione:
public String logout() {
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession)context.getExternalContext().getSession(false);
session.invalidate();
return “secpage”;
}
2) Nas páginas secureView.jsp e dataView.jsp, logo após Login, adicione:
3) Nas páginas secureView.jsp e dataView.jsp um formulario () logo apos a tag
Pronto, o logout está implementado!
Duvida - Eu nao consigo pegar a SecurityException, apesar de ter configurado o web.xml.
Em uma das msg anteriores disseram que possivelmente o JSF pode estar mascarando a excecao.
Alguem sabe como corrigir isto???
fiz alguns testes e isto depende da implementação JSF mascarar ou não a excessão, não tem muito como fujir disto.
Sei que com o JSF-RI funciona beleza desta forma …
Implementamos de outra forma, mas é mto parecida com a sua… Tem como ajudar a implementar algo usando JAAS? Fazendo isso aquele cadeado apareceria alí embaixo?
JAAS é Java Authentication and Authorization Service, ou seja, é um serviço da plataforma Java EE para tornar authenticação e authorização modulares.
Mas usar JAAS não vai fazer com que o cadeado apareça. utilizar HTTPS para acessar a aplicação vai fazer o cadeado aparecer, e depois disto, é possível utilizar certificadso digitais também para authenticação, o JAAS pode te ajudar nisto, mas não muito, e tu pode implementar isto sem JAAS também.
[...] as aplicações web necessitam de um mecanismo arrojado de segurança, muitas vezes uma simples página de login para autenticação e um Servlet Filter (ou phase listener) para autorização de recursos resolve [...]
olá.
Muito bom, parabéns pelo tuto.
Mas me diga, por que após executar o login uma vez e depois reiniciar a aplicação, eu consigo acessar os dados seguros sem precisar de login?
Espero uma resposta.
Obrigado
Também tentei, e mostra um servletException quando tento acessar sem login.
Onde eu altero para redirecionar para o login em vez de tentar acessar a página segura sem login?
obrigado.
isto provavelmente é algum problema na implementação do JSF utilizada …
não sei como resolver de forma fácil …
A idéia foi, mas não funcionou.
Como faz um blog em jsf!!!!?
Please help me….