sessão spring security

4 respostas
carlos_chea

Tudo bem pessoal???

quando se trabalha com spring security o usuário inicia uma sessão com o seu username e senha…

se eu quiser recuperar um dado deste usuário logado chama-se o método getUserPrincipal() do spring…

com ele eu posso recuperar: Username, Enabled, AccountNonExpired, credentialsNonExpired, AccountNonLocked, Granted Authorities, e Authenticated.

[size=13]acontece que eu tenho de adicionar mais atributos a esta sessão… como nome completo e Email.[/size] pois não seria certo eu pesquisar sempre no banco de dados para ver o nome completo ou o Email do usuário logado em todas as paginas…

a autenticação do banco foi feita da seguinte maneira (no arquivo xml do spring):

<authentication-manager>
		<authentication-provider>
			<password-encoder hash="md5" />
			<jdbc-user-service data-source-ref="dataSource"
           //seleciona o login e a senha do usuário
				users-by-username-query="SELECT logins.login, logins.senha, 'true' as enable FROM logins WHERE logins.login=?"
				//seleciona o nivel de autoridade deste respectivo usuário
           authorities-by-username-query="SELECT logins.login, nivel.autoridade FROM public.logins, public.nivel, public.funcionario WHERE funcionario.login_id = (SELECT logins.id FROM logins WHERE logins.login = ?) AND nivel.id = funcionario.nivel_id AND logins.id = funcionario.login_id" />
		</authentication-provider>
	</authentication-manager>
	<!-- Configurando o banco para o Spring security -->
	<beans:bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<beans:property name="url"
			value="jdbc:postgresql://localhost:5432/banco" />
		<beans:property name="driverClassName" value="org.postgresql.Driver" />
		<beans:property name="username" value="login" />
		<beans:property name="password" value="senha" />
	</beans:bean>

[size=13]como eu adiciono mais atributos a sessão do spring security???[/size]

4 Respostas

carlos_chea

Pesquisando, descobri que usando um customizing userdetails resolveria o meu problema!!!

mas, com os exemplos que eu encontrei, não entendi nada…

alguém já utilizou customizing userdetails???

alguém pode me ajudar???

carlos_chea

Alguém já fez algo parecido???

carlos_chea

Ninguém implementou isso???

wagnerfrancisco

Eu já implementei uma vez. Basicamente eu criei uma classe UserWrapper que herda de User (que implementa UserDetails). É uma classe simples, apenas adicione o atributo que você quer. Para popular este objeto eu criei um CustomUserDetailsService. Suprimindo código que não vem ao caso, é mais ou menos isso:

public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UsuarioDAO usuarioDAO;
    
    @Override
    @Transactional(readOnly=true)
    public UserDetails loadUserByUsername(String username)
       throws UsernameNotFoundException, DataAccessException {
	   Usuario usuario = usuarioDAO.porNomeDeUsuario(username);
		
        if (usuario == null) {
            throw new UsernameNotFoundException(username + " nao encontrado");
        }
        
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();        
        authorities.add(new GrantedAuthorityImpl("ROLE_USER"));
        
        return new UserWrapper(username, usuario.getSenha(), true, true, true, true,
                authorities, usuario);
	}
}

E o UserWrapper:

public class UserWrapper extends User {

	private Usuario usuario;
	private static final long serialVersionUID = 1L;

	public UserWrapper(String username, String password, boolean enabled,
			boolean accountNonExpired, boolean credentialsNonExpired,
			boolean accountNonLocked, Collection<GrantedAuthority> authorities,
			Usuario usuario) {
		super(username, password, enabled, accountNonExpired,
				credentialsNonExpired, accountNonLocked, authorities);
		this.usuario = usuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

}

Configurações do Spring:

<beans:bean id="userDetailsService" class="seu.pacote.CustomUserDetailsService"/>
<beans:bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="userDetailsService"/>
</beans:bean>
<authentication-manager>
<authentication-provider ref="daoAuthenticationProvider"/>
</authentication-manager>

Fiz isto há um certo tempo, talvez as versões novas tenham algo diferente.

Criado 1 de maio de 2012
Ultima resposta 7 de ago. de 2012
Respostas 4
Participantes 2