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

M

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.

M

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?

M

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