Spring Security + Vraptor Usuário Logado!

21 respostas
J

Pessoal estou usando o controle de usuário com Spring Security + Vraptor, está funcionando perfeitamente, eu consigo até pegar o usuário que está logado e mostrar ele no Formulário, ficou otimo, mas porém eu tenho uma tabela no meu banco chamado FUNCIONARIOS, cada usuário logado esta relacionado com essa tabela funcionario FK, logo eu preciso em todo sistema pegar o usuário logado e cadastrar em todas as tabelas, para saber qual usuário fez a devida modificação no sistema :

Exemplo:
tabela banco
id nome descricao usuruario_que_cadastrou
1 bbb banco 1
2 brasil banco 1
3 ccc banco 1
4 ddd banco 1

Esse campo usuruario_que_cadastrou seria o usuário logado no sistema:

ALGUÉM TEM IDÉIA COMO EU FAÇO ISSO ?

Em JSF eu dei uma pesquisada, pega-se o usuário corrente assim :
Authentication authentication = (Authentication) SecurityContextHolder.getContext().getAuthentication();   
          
        if(authentication != null){  
            Object obj = authentication.getPrincipal();  
              
            if (obj instanceof Usuario){  
                return (Usuario) obj;  
            }         
        }

no meu DAO ta assim :

public void salva(Bancos bancos){
        Transaction tx = session.beginTransaction();
        bancos.setBancDataCadastrou(new Date());
        bancos.setBancStatus("Ativo");
        //Users.getUsername();                                      ****************** aqui eu tenho que fazer alguma coisa para pegar o usuário logado !
        session.save(bancos);
        tx.commit();
    }
Parece Spring Security fornece uma (por segmento) "contexto" objeto a ser capaz de acessar o nome de usuário / info principal de qualquer lugar no seu aplicativo ...

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
... o que parece muito un-Spring como como esse objeto é um (global) Singleton, de certa forma.

21 Respostas

L

só colocar um FK pra usuario_id, não?

J

Não já tentei isso ! vou ter que pegar o usuário logado da seção !

junior.
G

juniorsatanas:
Não já tentei isso ! vou ter que pegar o usuário logado da seção !

junior.</blockquote>

Você diz que já consegue pegar o usuário da sessão e mostrar no formulário, qual o problema então?

J

g4j Boa tarde !

Sim eu pego o usuário da sessão assim :

&lt;div id="topoadm"&gt;
                                        &lt;!-- Inicio da div logout --&gt;
                                        &lt;div id="logout"&gt;
                                            &lt;sec:authorize ifNotGranted="ROLE_ANONYMOUS"&gt;
                                                USUÁRIO LOGADO NO SISTEMA S.I.G.I.:&lt;%= request.getUserPrincipal().getName()%&gt;
                                                <a /j_spring_security_logout"/>&quot;&gt;Sair</a>
                                            &lt;/sec:authorize&gt;
                                        &lt;/div&gt;
                                        &lt;!-- Fim da div logout  --&gt;
                                    &lt;/div&gt;
# public void salva(Bancos bancos){  
#       Transaction tx = session.beginTransaction();  
#       bancos.setBancDataCadastrou(new Date());  
#       bancos.setBancStatus("Ativo");  
#       //Users.getUsername();                                      ****************** aqui eu tenho que fazer alguma coisa para pegar o usuário logado !  
#       session.save(bancos);  
#       tx.commit();  
#   }
J

Mas setar esse usuário do banco eu não sei fazer !

G

Entendi, acho que é isto que você quer:

http://www.ashishpaliwal.com/blog/2009/02/spring-security-%E2%80%93-implementing-custom-userdetails-using-hibernate/

Edit: Mais sobre: http://www.google.com.br/#hl=pt-BR&biw=1584&bih=739&q=spring+security+userdetails&aq=f&aqi=&aql=&oq=&fp=74c10a6dca3cb2be

J

g4j Dei uma lida no link estou tentando fazer aqui obrigado !

Tu tem alguma sugestão para fazer isso ?

Abraço.

G

juniorsatanas:
g4j Dei uma lida no link estou tentando fazer aqui obrigado !

Tu tem alguma sugestão para fazer isso ?

Abraço.

Você deve encontrar isso na própria documentação do spring. Procure por “spring security hibernate login”

[]'s

J

Li ela todinha em inglês, tem chongas falando disso…

K

Junior,

Cria uma classe chamada UsuarioSession. Como @SessionScoped.

Depois crie um interceptor para capturar qualquer requisição que seja feita. Lá você faz a verificação se o usuário existe no context do Spring. Se existir você seta ele no UsuarioSession.

J

king_of_gods Boa Tarde !

Vou tentar isso, acho que deve pegar !

Abraço e otima idéia !

K

Algo deste tipo:

@SessionScoped
@Component
public class UsuarioSessao implements Serializable {

	private static final long serialVersionUID = -2338996259000582361L;
	
	private Usuario usuario;

        // Getter's e Setter's
}
@Intercepts
@RequestScoped
public class UsuarioInterceptor implements Interceptor {

@Override
	public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance)
			throws InterceptionException {
		// Busca o usuário e seta no usuarioSessao;

}
J

Eu já consigo pegar o usuário logado, agora só falta setar ele no banco !

&lt;tr&gt;
                                                &lt;td height="30" align="right" class="tabelaFonte"&gt;Funcionário Cadastrou&lt;/td&gt;
                                                &lt;td height="30"&gt;&lt;span id="spryselect1"&gt;

                                                        &lt;select name="bancos.bancFkFuncionarioCadastrouId.funcPkId"&gt;
                                                        &lt;!--&lt;select name="&lt;%= request.getUserPrincipal().getName()%&gt;"&gt;--&gt;

                                                            &lt;option selected="selected"&gt;Selecione um Funcionário&lt;/option&gt;
                                                            &lt;c:forEach var="funcionario" items="${funcionarios}"&gt;
                                                                &lt;option value="${funcionario.funcPkId}"&gt;&lt;%= request.getUserPrincipal().getName()%&gt;&lt;/option&gt;
                                                            &lt;/c:forEach&gt;
                                                        &lt;/select&gt;<br />
                                                        &lt;span class="selectRequiredMsg"&gt;Por favor selecione um Funcionário.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
                                            &lt;/tr&gt;
                                            &lt;tr&gt;
K

Tem que setar o usuário em alguma entidade e salvar.

J

Do jeito que ta ele salva o usuário corrente: mas não o logado, como vc falou tem que ta no @scopo

ficando assim : Código 21 Nome TESTE Status Ativo Data do Cadastro 2011-04-18 15:00:38.985 Data da Desativação Descrição TESTE Funcionário que Cadastrou Código : 1 - Nome : AGONIA NERD - CPF : 123123

Esse funcionário que cadastrou não é o que ta logado…

K

Então você tem que dar um setFuncionario(usuarioSessao.getUsuario);

J

king_of_gods BOA NOITE…

Tu já fez isso no SpringSecurity ?

abraço.

K

Junior,

Você está confundindo um pouco as coisas.

Sprint Security ele não salva nada. Ele apenas autentica o usuário.

Depois disso, sua aplicação é responsável por capturar esse usuário e persisti-lo no BD.

J

King Bom dia.

Eu estava imaginando isso, então posso pegar o usuário logado com a anotação @ do Vraptor e setar esse valor no gando é isso ?
K

Júnior,

Não quero te ofender, apenas uma dica.

Dá uma estudada em lógicas Pojos, Injeção de dependências e no VRaptor. Depois disso dá uma lida em Servlets e sistemas WEB.

Você está com uma dúvida trivial. Eu posso responder e resolver seu problema. Mas acho melhor deixar você entender sua dúvida e entender como resolver.

=)

J

king_of_gods Boa Tarde !

Não ofende não amigão, eu também acho que é trivial, mas não conseguir por para rodar, tanto eu como 2 amigos aqui do trabalho.. se você sabe pouparia tempo, mas tenha certeza que estou dando uma lida no que você falou..

aAbraço.

Jr

Criado 6 de abril de 2011
Ultima resposta 25 de abr. de 2011
Respostas 21
Participantes 4