it-swarm-pt.tech

Como adicionar novo usuário ao Spring Security em tempo de execução

Eu salvo usuários em uma tabela de banco de dados via Hibernate e estou usando o Spring Security para autenticar:

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.configuration.*;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

E isso funciona perfeitamente, mas há um ponto - o usuário é carregado durante o início do servidor. Preciso escrever o método RegisterUser (Usuário usuário) que adicione um novo usuário ao Spring Security em tempo de execução. Este método deve se concentrar apenas nessa tarefa. Eu não sei como começar a implementar esse recurso, então obrigado por quaisquer conselhos! ;)

Ofc O usuário tem campos como login, senha, cadeia de papéis, etc etc ...

Não poste soluções com o Spring MVC. Este sistema é um aplicativo RESTful usando o Spring Web Boost e o Spring Security Boost na versão 4.0.x

15
Przemysław Malinowski

Você provavelmente deseja armazenar seus usuários em um banco de dados e não na memória, se eles estiverem registrando :)

  1. Crie autoridades para o usuário

    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
    
  2. Instanciar o usuário (com uma classe implementando serDetails )

    UserDetails user = new User("[email protected]", passwordEncoder.encode("s3cr3t"), authorities);
    
  3. Salve o usuário em algum lugar útil. O JdbcUserDetailsManager pode salvar um usuário em um banco de dados facilmente.

    userDetailsManager.createUser(user);
    
  4. Crie um nome de usuárioPasswordAuthenticationToken

    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
    
  5. Adicione a autenticação ao SecurityContext

    SecurityContextHolder.getContext().setAuthentication(authentication);
    
7
Neil McGuigan

use este código para adicionar autoridade ao usuário atual:

List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_NEWUSERROLE'); 
    SecurityContextHolder.getContext().setAuthentication(
        new UsernamePasswordAuthenticationToken(
            SecurityContextHolder.getContext().getAuthentication().getPrincipal(),
            SecurityContextHolder.getContext().getAuthentication().getCredentials(),
            authorities)
        );
0
M2E67