O que é nome de usuário e senha ao iniciar o Spring Boot com Tomcat?

147

Quando implanto meu aplicativo Spring via Spring Boot e acesso localhost:8080, preciso me autenticar, mas qual é o nome de usuário e a senha ou como posso defini-lo? Tentei adicionar isso ao meu tomcat-usersarquivo, mas não funcionou:

<role rolename="manager-gui"/>
    <user username="admin" password="admin" roles="manager-gui"/>

Este é o ponto de partida do aplicativo:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

E esta é a dependência do Tomcat:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

Como eu me autentico localhost:8080?

Gustavo
fonte
Configurando spring-boot-starter-security .
Elliott Frisch
Você precisa se autenticar = deseja ter autenticação? Porque não há autenticação nem nome de usuário e senha em spring-boot-starter-tomcat / -web. Se você
vir
2
E está impresso no console no lançamento.
chrylis -cautiouslyoptimistic-

Respostas:

297

Eu acho que você tem o Spring Security no caminho da classe e, em seguida, o Spring Security é configurado automaticamente com um usuário padrão e uma senha gerada

Por favor, procure no seu arquivo pom.xml por:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Se você tem isso em seu pom, deve ter uma mensagem do console de log como esta:

Using default security password: ce6c3d39-8f20-4a41-8e01-803166bb99b6

E no prompt do navegador, você importará o usuário usere a senha impressa no console.

Ou, se você deseja configurar a segurança da primavera, consulte o exemplo seguro da Spring Boot

É explicado na documentação de Referência da Inicialização do Spring na seção Segurança , indica:

The default AuthenticationManager has a single user (‘user username and random password, printed at `INFO` level when the application starts up)

Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
Marcel Dias
fonte
23
Se você ajustar sua configuração de log, verifique se a org.springframework.boot.autoconfigure.securitycategoria está definida para registrar mensagens INFO, caso contrário, a senha padrão não será impressa.
Zeeshan
lindo. tudo padrão para alguma coisa. espada de dois gumes.
Sachin Sharma
1
para o meu caso (spring boot vs: 2.0.4), o console é "Usando a senha de segurança gerada: eb7a9e02-b9cc-484d-9dec-a295b96d94ee"
Amir
Este foi apenas o caso para mim também. Eu estava prestes a começar a fazer perguntas sobre isso.
Dmitriy Ryabin 9/12/19
@ Marcel eu adicionei a segurança spring no caminho da classe e posso ver a senha gerada, mas quando uso no auth básico via carteiro como nome de usuário e senha como senha gerada. Estou sendo desautorizado.
Lokesh Pandey
50

Se spring-securityjars forem adicionados no caminho de classe e também se for spring-bootaplicativo, todos os pontos de extremidade http serão protegidos pela classe de configuração de segurança padrãoSecurityAutoConfiguration

Isso faz com que um pop-up do navegador solicite credenciais.

A senha é alterada para cada aplicativo reiniciado e pode ser encontrada no console.

Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35

Para adicionar sua própria camada de segurança do aplicativo à frente dos padrões,

@EnableWebSecurity
public class SecurityConfig {

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

ou se você quiser alterar a senha, poderá substituir o padrão por,

application.xml

security.user.password = new_password

ou

application.properties

spring.security.user.name=<>
spring.security.user.password=<>
Vino
fonte
Acabei de adicionar spring.security.user.name = <> spring.security.user.password = <> ao arquivo application.properties. Eu não fiz mais nada. Ainda funcionou.
Barani r
Você tem o seu mal nome da propriedade no exemplo xml É de spring.security.user.password = xxx Não tenho certeza sobre o XML formatação quer como usamos arquivos .yml
davidfrancis
Ao usar o inMemoryAuthenticationprefixo de sua senha com {noop} ao receber o erro:There is no PasswordEncoder mapped for the id “null”
Martin van Wingerden
adicione isso na classe SecurityConfig @Bean public PasswordEncoder passwordEncoder () {return NoOpPasswordEncoder.getInstance (); } Ele pode corrigir Não há PasswordEncoder mapeado para o ID “null”
apss1943
9

Ao substituir

spring.security.user.name=
spring.security.user.password=

em application.properties , você não precisa estar por "perto "username", basta usar username. Outro ponto, em vez de armazenar a senha bruta , criptografe-a com bcrypt / scrypt e armazene-a como

spring.security.user.password={bcrypt}encryptedPassword
Jemshit Iskenderov
fonte
3

Se você não conseguir encontrar a senha com base em outras respostas que apontam para uma padrão, o texto da mensagem de log nas versões recentes será alterado para

Using generated security password: <some UUID>
gdecaso
fonte
2

Você também pode solicitar as credenciais ao usuário e configurá-las dinamicamente quando o servidor iniciar (muito eficaz quando você precisar publicar a solução no ambiente do cliente):

@EnableWebSecurity
public class SecurityConfig {

    private static final Logger log = LogManager.getLogger();

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        log.info("Setting in-memory security using the user input...");

        Scanner scanner = new Scanner(System.in);
        String inputUser = null;
        String inputPassword = null;
        System.out.println("\nPlease set the admin credentials for this web application");
        while (true) {
            System.out.print("user: ");
            inputUser = scanner.nextLine();
            System.out.print("password: ");
            inputPassword = scanner.nextLine();
            System.out.print("confirm password: ");
            String inputPasswordConfirm = scanner.nextLine();

            if (inputUser.isEmpty()) {
                System.out.println("Error: user must be set - please try again");
            } else if (inputPassword.isEmpty()) {
                System.out.println("Error: password must be set - please try again");
            } else if (!inputPassword.equals(inputPasswordConfirm)) {
                System.out.println("Error: password and password confirm do not match - please try again");
            } else {
                log.info("Setting the in-memory security using the provided credentials...");
                break;
            }
            System.out.println("");
        }
        scanner.close();

        if (inputUser != null && inputPassword != null) {
             auth.inMemoryAuthentication()
                .withUser(inputUser)
                .password(inputPassword)
                .roles("USER");
        }
    }
}

(Maio de 2018) Uma atualização - isso funcionará no boot da primavera 2.x:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final Logger log = LogManager.getLogger();

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Note: 
        // Use this to enable the tomcat basic authentication (tomcat popup rather than spring login page)
        // Note that the CSRf token is disabled for all requests
        log.info("Disabling CSRF, enabling basic authentication...");
        http
        .authorizeRequests()
            .antMatchers("/**").authenticated() // These urls are allowed by any authenticated user
        .and()
            .httpBasic();
        http.csrf().disable();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        log.info("Setting in-memory security using the user input...");

        String username = null;
        String password = null;

        System.out.println("\nPlease set the admin credentials for this web application (will be required when browsing to the web application)");
        Console console = System.console();

        // Read the credentials from the user console: 
        // Note: 
        // Console supports password masking, but is not supported in IDEs such as eclipse; 
        // thus if in IDE (where console == null) use scanner instead:
        if (console == null) {
            // Use scanner:
            Scanner scanner = new Scanner(System.in);
            while (true) {
                System.out.print("Username: ");
                username = scanner.nextLine();
                System.out.print("Password: ");
                password = scanner.nextLine();
                System.out.print("Confirm Password: ");
                String inputPasswordConfirm = scanner.nextLine();

                if (username.isEmpty()) {
                    System.out.println("Error: user must be set - please try again");
                } else if (password.isEmpty()) {
                    System.out.println("Error: password must be set - please try again");
                } else if (!password.equals(inputPasswordConfirm)) {
                    System.out.println("Error: password and password confirm do not match - please try again");
                } else {
                    log.info("Setting the in-memory security using the provided credentials...");
                    break;
                }
                System.out.println("");
            }
            scanner.close();
        } else {
            // Use Console
            while (true) {
                username = console.readLine("Username: ");
                char[] passwordChars = console.readPassword("Password: ");
                password = String.valueOf(passwordChars);
                char[] passwordConfirmChars = console.readPassword("Confirm Password: ");
                String passwordConfirm = String.valueOf(passwordConfirmChars);

                if (username.isEmpty()) {
                    System.out.println("Error: Username must be set - please try again");
                } else if (password.isEmpty()) {
                    System.out.println("Error: Password must be set - please try again");
                } else if (!password.equals(passwordConfirm)) {
                    System.out.println("Error: Password and Password Confirm do not match - please try again");
                } else {
                    log.info("Setting the in-memory security using the provided credentials...");
                    break;
                }
                System.out.println("");
            }
        }

        // Set the inMemoryAuthentication object with the given credentials:
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        if (username != null && password != null) {
            String encodedPassword = passwordEncoder().encode(password);
            manager.createUser(User.withUsername(username).password(encodedPassword).roles("USER").build());
        }
        return manager;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
Naor Bar
fonte
2

Além da resposta aceita -

Se a senha não for vista nos logs, ative os logs "org.springframework.boot.autoconfigure.security".

Se você ajustar sua configuração de log, verifique se a categoria org.springframework.boot.autoconfigure.security está definida para registrar mensagens INFO, caso contrário, a senha padrão não será impressa.

https://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/htmlsingle/#boot-features-security

Ninad Pingale
fonte
0

Quando comecei a aprender o Spring Security, substituí o método userDetailsService () como no trecho de código abaixo:

@Configuration
@EnableWebSecurity
public class ApplicationSecurityConfiguration extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/", "/index").permitAll()
                .anyRequest().authenticated()
                .and()
                .httpBasic();
    }

    @Override
    @Bean
    public UserDetailsService userDetailsService() {
        List<UserDetails> users= new ArrayList<UserDetails>();
        users.add(User.withDefaultPasswordEncoder().username("admin").password("nimda").roles("USER","ADMIN").build());
        users.add(User.withDefaultPasswordEncoder().username("Spring").password("Security").roles("USER").build());
        return new InMemoryUserDetailsManager(users);
    }
}

Portanto, podemos fazer login no aplicativo usando os creds mencionados acima. (por exemplo, admin / nimda)

Nota: Isso não devemos usar na produção.

VicXj
fonte
0

Tente usar o nome de usuário e a senha abaixo do snipet de código em seu projeto e faça o login e espero que isso funcione.

@Override
    @Bean
    public UserDetailsService userDetailsService() {
        List<UserDetails> users= new ArrayList<UserDetails>();
        users.add(User.withDefaultPasswordEncoder().username("admin").password("admin").roles("USER","ADMIN").build());
        users.add(User.withDefaultPasswordEncoder().username("spring").password("spring").roles("USER").build());
        return new UserDetailsManager(users);
    }
Manas Ranjan Mahapatra
fonte