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

14 respostas
C

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.

14 Respostas

MaiqueL

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

C

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.

C

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.

MaiqueL

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.

C

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:
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
session.setAttribute("logado", username); 
                         
FacesContext faces = FacesContext.getCurrentInstance();
ExternalContext context = faces.getExternalContext();
context.redirect("neo.matrix");

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

MaiqueL

C

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.
Eu já estou utilizando para proteger diretórios inteiros, mas tá protegendo até quando eu faço o login correto.

Veja.

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.
Pensei que o rendered só servia pra mostrar aquelas mensagens tipo: “campo requerido, login inválido”.

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

C

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!

D

Também estou interessado.

Ninguém?

D

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:
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() {

      }

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

C

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.

C

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.

D

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

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- Configuração da autenticação e autorização. -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<security-constraint>
    
    <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>
    
</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>StripesSecRealm</realm-name>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>

<security-role>
    <role-name>systemuserEditor</role-name>
    <role-name>systemuserAdmin</role-name>
</security-role>

obrigado.

D

Resolvido tambem.

Eles também me ajudaram. ^^

Criado 27 de fevereiro de 2009
Ultima resposta 4 de abr. de 2009
Respostas 14
Participantes 3