JSF - Mostrar conteúdo apenas para admin com sessão ou outra coisa

Olá caros membros.

Desculpe a perguntação mas é que na busca a fora eu só encontro pool de conexões mas não é o que procuro.

Teria como, em JSF, mostrar conteúdo apenas para admin com sessão ou outra coisa?

Em JSP fazemos aqueles chatos testes com if pra checar se a sessão está aberta, mas como faço, por exemplo, pra mostrar links de editar apenas para administradores ou até mesmo controlar sessões de algumas páginas?

Grato pela colaboração.

Olá cebolah,

O comun em JSF é você utilizar um PhaseListener, ele trabalha como um filtro.Dentro dessa classe você pode pegar o usuário da sessão e verificar se
ele é um usuário com permissão, leia sobre o assunto.

Obs.:É uma solução razoável para seu problema utilizar o PheseListner, embora tenha algumas coisas que você deve estudar futuramente
como perfis de usuários no container.

Maiquel

Ok, vou pesquisar a respeito. Até já li sobre o assunto, mas foi quando não me interessava ainda.

Obrigado pela dica.

Também vou pesquisar sobre perfis de usuário no container.

grato pela sua colaboração amigo.

abraços.

Já pesquisei bastante e encontrei uma solução sim, masera para diretórios completos, utilizando o Realm.

O que eu procurava também era como mostrar botões contendo
links para editar algum dado da página, mas isso apenas para o usuário autorizado.

Em JSP usamos sessões pra isso, e em JSF?

Agradeço a ajuda até agora.

Eu sugiro você dividir em dois diretórios o que um administrador pode fazer em uma pasta e o que o usuário limitado pode fazer em outra pasta.

Mas tudo bem você quer outra solução :
altera a vizibilidade de determinado link ou botão enfim outro compoenente.

exemplo

<h:inputText value="#{hwBean.nome}" rendered="true" />

o atributo rendered define a visibilidade da inputtext então acho que aqui você já sacou a idéia.

Claro é isso mesmo com a sessão você vai usar um true ou false pra definir a vizibilidade da inputext ou qualquer coisa do genero.

Sim, este eu conheço, graças a ajuda dos membros daqui.
O problema é que queria que o componente ficasse visível após o uauário autorizado fazer login,
poderia ser um admin ou algum editor, etc.

Se eu crio sessão no bean e depois redireciono, eu teria que pegar sessão como no JSP e isso também não quero.

Então como mostro componentes na tela apenas para usuários logados no sistema?

  • PS: isso pode ocorrer na mesma página, pra poupar a criação de novas
    páginas apenas pra editar uma tabela com banco de dados, por exemplo.

Exemplo na bean:

[code]HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
session.setAttribute(“logado”, username);

FacesContext faces = FacesContext.getCurrentInstance();
ExternalContext context = faces.getExternalContext();
context.redirect(“neo.matrix”);[/code]

Não sei se é o correto mas após fazer o login redireciona corretamente.
Mas e a sessão neste caso?

[quote=MaiqueL]Se você quer garantir que usuário está logado só poderá garantir com um Filter( acho que você conhece tbm é muito utilizado com servlets e JSP) ou um PheaseListner é a maneira mais fácil foi como eu comentei organizando por pastas e usar um desses dois caras.[/quote]Eu já estou utilizando para proteger diretórios inteiros, mas tá protegendo até quando eu faço o login correto.

Veja.

[quote]Quanto a retutilização de páginas só com rendered você pode definir se é visível ou não fora isso não vejo outra solução.[/quote]Pensei que o rendered só servia pra mostrar aquelas mensagens tipo: “campo requerido, login inválido”.

[quote]Obs.:Você pode adicionar dentro do bean um usuário. Sessão não é recomendado, mas é uma soluçao.
Eu procuro definir um bean como session e trabalhar com ele.[/quote]Eu teria que definir a bean como session pra isso? Mas ela já está como request, então se eu criar um conectionBean para a conexão e definir como session e deixar a outra bean request para os selects, delete, update , isso vai resolver?

Eh, o PhaseListener não está configurado direito, não consigo acesso após submeter o login correto.
Mostra mensagem de erro: “HTTP Status 403 - Access to the requested resource has been denied”.

Configurei o web.xml assim:

e o context.xml assim:


Desta maneira não acontece nada ao fazer o login corretamente.
Mas se eu modifico a linha [ Resource name=“jdbc/matrix” ] dá erro 403 - acesso negado.

Acho que não estou sabendo configurar o context.xml.

Alguma dica?

Obrigado!

Também estou interessado.

Ninguém?

Bom, eu consegui utilizar um Filter, só que ele só protege o diretório admin, seus sub-diretórios ficam expostos, mesmo eu configurando como a]/admin/*

<filter> <filter-name>Filtro Seguranca</filter-name> <filter-class>filter.FiltroSeguranca</filter-class> </filter> <filter-mapping> <filter-name>Filtro Seguranca</filter-name> <url-pattern>/admin/*</url-pattern> </filter-mapping>

Aqui está o servlet:

[code]public class FiltroSeguranca implements Filter {

  public void init(FilterConfig config) throws ServletException {

  }

  public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) 
          throws IOException, ServletException {
        HttpSession session = ((HttpServletRequest)req).getSession();
        String usuario = (String)session.getAttribute("logado");
        if(usuario==null){
              //session.setAttribute("msg","Você não está logado no sistema!");
              ((HttpServletResponse)res).sendRedirect(".././");
        } else {
              chain.doFilter(req, res);
        }
  }

  public void destroy() {

  }[/code]

Bom, não queria utilizar filtro, mas parece que é a única maneira que está funcionando por aqui. :roll:

Eu encontrei este link aqui que quase deu certo.

No faces-config, a tag dava um redirecionamento sem fim na aplicação.

Bom, foi o melhor exemplo de PhaseListener que eu já vi, pena que só funciona na teoria.

abraços.

Resolvi. Contatei o admin dos blogs e eles acrescentaram a resposta lá no blog deles.

Então sugiro que visitem os links que já estão no tópico e quem tiver o mesmo problema encontratá a resposta.

Obrigado a todos. Foram de ótima ajuda.

até mais.

Mas tem um porém nisso tudo.

Como configuro pra um usuário logado acessar apenas seus diretórios.
Eu me loguei como editor e acessei os arquivos de um administrador da aplicação.
Ainda tem o problema que as vezes ao realizar o login corretamente sou redirecionado à página de login novamente, só que mostra erro, pois tenta redirecionar pra dentro de um diretório onde não existe esta página.
veja:
web.xml

[code]

<display-name>Área de Edição</display-name>
<web-resource-collection>
    <web-resource-name>Arquivos protegidos por login</web-resource-name>
    <url-pattern>/editor/*</url-pattern>
</web-resource-collection>
<auth-constraint>
    <role-name>systemuserEditor</role-name>
</auth-constraint>

<display-name>Área de Administração</display-name>
<web-resource-collection>
    <web-resource-name>Arquivos protegidos por login</web-resource-name>
    <url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
    <role-name>systemuserAdmin</role-name>
</auth-constraint>
FORM StripesSecRealm /login.jsp /error.jsp systemuserEditor systemuserAdmin [/code]

obrigado.

Resolvido tambem.

Eles também me ajudaram. ^^