Mostrar ou nao - rendered - Spring Security

12 respostas
A

estou fazendo uma aplicação web com spring security.. ta funcionando certinho e eu tenho duas roles; ROLE_USER e ROLE_ADMIN
e eu tenho na página 2 div's uma eu vou exibir se o usuário estiver logado... e a outra se o usuário estiver deslogado..

então eu tenho o seguinte código:
<section id="login">
                        <h:panelGroup>
                            <div id="off">
                                <div id="fotoUser">
                                    <h:graphicImage value="/img/userOff.jpg" width="40" height="40" title="Visitante" alt="Visitante"/>
                                </div>
                                <div class="alinhaTextoUser">
                                    <div class="saudacaoUser">
                                        Beleza<h:outputText styleClass="saudacaoNegrito" value=" Visitante?"/><br/>
                                        Faça seu <h:outputLink value="/usuario/meu-cadastro.xhtml">login</h:outputLink> ou <h:outputLink value="/cadastro.xhtml">cadastre-se</h:outputLink>
                                    </div>
                                </div>
                            </div>
                        </h:panelGroup>
                        
                        <h:panelGroup rendered="#{facesContext.externalContext.isUserInRole('ROLE_ADMIN') or facesContext.externalContext.isUserInRole('ROLE_USER')}">
                            <div id="logado">
                                <div id="fotoUser">
                                    <h:graphicImage value="/img/userOn.jpg" width="40" height="40" title="Flechada" alt="Flechada"/>
                                </div>
                                <div class="alinhaTextoUser">
                                    <div class="saudacaoUser">
                                        E <h:outputText styleClass="saudacaoNegrito" value=" Flechada"/>, beleza?<br/>
                                        <h:outputLink value="#">Meu Espaço</h:outputLink> | <h:outputLink value="#">Favoritos</h:outputLink> | <h:outputLink style="color: #cc6666;" value="#">Sair</h:outputLink>
                                    </div>
                                </div>
                            </div>
                        </h:panelGroup>
                    </section>

a segunda div que tem:
ta funcionando normal... se o usuário ta logado em alguma role ele aparece...
o problema é que eu não consigo esconder a outra div se o usuário estiver logado... ai fica aparecendo as duas.. :(
ja tentei fazer a mesma coisa da segunda e colocando ! ficando +ou-... #{!facesCont...} mais num deu certo...

alguém tem alguma idéia?

12 Respostas

H

Na verdade troque de ! para not

Na verdade, o melhor seria você colocar esse método em um ManagedBean e de dentro dele retornar um boolean apenas true ou false.

Aí você poderia fazer método tipo: public boolean isAdmin(){}.

A

Na verdade troque de ! para not
R: tentei… mais não deu certo :frowning:
tentei not, empty, !, null… tentei de tudo rsrs

Na verdade, o melhor seria você colocar esse método em um ManagedBean e de dentro dele retornar um boolean apenas true ou false.
R: concordo com vc…

Aí você poderia fazer método tipo: public boolean isAdmin(){}.
R: to tentando faze o seguinte:
no xhtml: rendered="#{usuarioController.estaLogado}"
no bean: public boolean estaLogado() { SecurityContext context = SecurityContextHolder.getContext(); if (context instanceof SecurityContext) { Authentication authentication = context.getAuthentication(); if (authentication instanceof Authentication) { return true; } else { return false; } } else { return false; } }

porém da esse erro:

GRAVE: Error Rendering View[/index.xhtml]
com.sun.faces.mgbean.ManagedBeanCreationException: Não é possível criar instância para·a classe: br.com.techsquare.controller.UsuarioController.
	at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193)
	at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
	at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
	at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
	at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
	at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
	at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
	at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
	at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:147)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:193)
	at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:421)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.security.core.userdetails.User
	at br.com.techsquare.controller.UsuarioController.<init>(UsuarioController.java:31)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at java.lang.Class.newInstance0(Class.java:355)
	at java.lang.Class.newInstance(Class.java:308)
	at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188)
	... 65 more
H

Se vc olhar a mensagem de erro ele ta tentando converter uma String para java.lang.String cannot be cast to org.springframework.security.core.userdetails.User

Oq vc tem nessa linha?
br.com.techsquare.controller.UsuarioController.(UsuarioController.java:31)

A

então eu não sei o que tem de errado com meu UsuarioController;

package br.com.techsquare.controller;

import br.com.techsquare.dao.UsuarioDAO;
import br.com.techsquare.dao.UsuarioDAOImp;
import br.com.techsquare.modelo.Usuario;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.util.List;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

/**
 *
 * @author alan
 */
@ManagedBean
@SessionScoped
public class UsuarioController {

    private Usuario usuario;
    private List<Usuario> usuarios;

    public UsuarioController() {
        usuario = new Usuario();
        SecurityContext context = SecurityContextHolder.getContext();
        if (context instanceof SecurityContext) {
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof Authentication) {
                usuario.setUsername(((User) authentication.getPrincipal()).getUsername());
                 //nessa linha de cima da erro, nao sei pq.... + ela funciona normal quando eu logo e talz..
            }
        }
    }

//e quando eu chamo o metodo estalogado eu nao tenho nenhum casting..
    public boolean estaLogado() {
        SecurityContext context = SecurityContextHolder.getContext();
        if (context instanceof SecurityContext) {
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof Authentication) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}
H

Isso aqui:
usuario.setUsername(((User) authentication.getPrincipal()).getUsername());

Troque para
usuario.setUsername(authentication.getPrincipal());

Eu saco nada de spring, mas sei que o erro tá aí! =P

A

jakefrog:
Isso aqui:
usuario.setUsername(((User) authentication.getPrincipal()).getUsername());

Troque para
usuario.setUsername(authentication.getPrincipal());

Eu saco nada de spring, mas sei que o erro tá aí! =P

intão, tentei faze isso já rsrs…tentei altera pra (Usuario) o casting… mais da erro…
se eu faço esse jeito ai aparece a lampadinha falando pra min criar um método assim:

“Criar método setUsername(java.lang.Object) em pacote.modelo.Usuario”

H

Oq isso aqui retorna? authentication.getPrincipal()

E como esta seu setUserName?

Posta tudo não, só isso aí.

A

isso ak é pra depois que o cara loga pega o nome dele:
usuario.setUsername(((User) authentication.getPrincipal()).getUsername());

o problema é o seguinte…
o spring pra autentica nao usa nenhuma classe java, (de modo indireto) eu nao preciso criar nada…
essa classe UsuarioController é apenas pra min pega o nome dele…
se eu tentar instanciar a UsuarioController sem estar logado da erro!

por isso esse código funciona: rendered="#{facesContext.externalContext.isUserInRole(‘ROLE_ADMIN’) or facesContext.externalContext.isUserInRole(‘ROLE_USER’)}"

agora eu precisava do inverso disso ai… + nao da certo colocar !, or, not, empty, null, :frowning:

A

tem um esquema de <sac: mais num consigo faze funfa… e eu tenho a lib e o xmlns certinho!

<h:outputText value="Lorem ipsum dolor sit amet" rendered="#{sec:areAllGranted('ROLE_FOO, ROLE_BAR')}"/>

ai dava pra min opor !sec

H

Cara, vou voltar ao erro: String para java.lang.String cannot be cast to org.springframework.security.core.userdetails.User

Tenta fazer isso aqui String nome = (String) authentication.getPrincipal(); usuario.setUserName(nome);.

Foi por isso q eu te perguntei oq um método retorna e o q o outro aceita.

A

quando eu inicio o projeto e faço login, em nenhum momento eu chamo a UsuarioController…
o spring security nao precisa dele…

esse jeito q vc falo:

String nome = (String) authentication.getPrincipal();

usuario.setUserName(nome);

acaba atribuindo “anonymousUser” pra usuario.username

o skema todo ta no rendered do xhtml
nao precisa de classe

ta tenso, num acho d jeito nenhum

A

veja este tópico

essa UsuarioController é apenas pra pega o usuário depois de logado
se tenta pega sem o usuário ta logado da erro

Criado 1 de abril de 2012
Ultima resposta 1 de abr. de 2012
Respostas 12
Participantes 2