Was ist Benutzername und Passwort beim Starten von Spring Boot mit Tomcat?

146

Wenn ich meine Spring-Anwendung über Spring Boot und Zugriff bereitstelle, muss localhost:8080ich mich authentifizieren. Wie lautet jedoch der Benutzername und das Kennwort oder wie kann ich sie festlegen? Ich habe versucht, dies zu meiner tomcat-usersDatei hinzuzufügen, aber es hat nicht funktioniert:

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

Dies ist der Ausgangspunkt der Anwendung:

@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);
    }
}

Und das ist die Tomcat-Abhängigkeit:

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

Wie authentifiziere ich mich bei localhost:8080?

Gustavo
quelle
Durch Einrichten der Spring-Boot-Starter-Sicherheit .
Elliott Frisch
Sie müssen sich authentifizieren = Sie möchten eine Authentifizierung haben? Weil es in Spring-Boot-Starter-Tomcat / -web weder Authentifizierung noch Benutzername und Passwort gibt. Wenn Sie einige sehen, ist es wahrscheinlich eine andere Anwendung am: 8080
zapl
2
Und es wird beim Start auf der Konsole gedruckt.
Chrylis

Antworten:

296

Ich denke, Sie haben Spring Security in Ihrem Klassenpfad und dann wird Spring Security automatisch mit einem Standardbenutzer und einem generierten Passwort konfiguriert

Bitte schauen Sie in Ihre pom.xml-Datei nach:

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

Wenn Sie das in Ihrem POM haben, sollten Sie eine Protokollkonsolenmeldung wie die folgende haben:

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

In der Browser-Eingabeaufforderung importieren Sie den Benutzer userund das in der Konsole gedruckte Kennwort.

Wenn Sie die Federsicherheit konfigurieren möchten, sehen Sie sich das Beispiel für den gesicherten Spring Boot an

Es wird in der Spring Boot Reference-Dokumentation im Abschnitt Sicherheit erläutert. Es gibt Folgendes an:

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
quelle
23
Wenn Sie Ihre Protokollierungskonfiguration optimieren, stellen Sie sicher, dass die org.springframework.boot.autoconfigure.securityKategorie so eingestellt ist, dass INFO-Nachrichten protokolliert werden. Andernfalls wird das Standardkennwort nicht gedruckt.
Zeeshan
wunderschönen. alles war standardmäßig auf etwas eingestellt. zweischneidiges Schwert.
Sachin Sharma
1
Für meinen Fall (Spring Boot vs: 2.0.4) lautet die Konsole "Verwenden des generierten Sicherheitskennworts: eb7a9e02-b9cc-484d-9dec-a295b96d94ee"
Amir,
Dies war auch bei mir der Fall. Ich wollte gerade anfangen, Fragen zu stellen.
Dmitriy Ryabin
50

Wenn spring-securityJars im Klassenpfad hinzugefügt werden und es sich auch um eine spring-bootAnwendung handelt, werden alle http-Endpunkte durch die Standard-Sicherheitskonfigurationsklasse gesichertSecurityAutoConfiguration

Dies führt dazu, dass ein Browser-Popup nach Anmeldeinformationen fragt.

Die Kennwortänderungen für jede Anwendung werden neu gestartet und befinden sich in der Konsole.

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

Um Ihre eigene Ebene der Anwendungssicherheit vor den Standardeinstellungen hinzuzufügen,

@EnableWebSecurity
public class SecurityConfig {

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

oder wenn Sie nur das Passwort ändern möchten, können Sie die Standardeinstellung überschreiben mit:

application.xml

security.user.password = neues_password

oder

application.properties

spring.security.user.name=<>
spring.security.user.password=<>
Vino
quelle
Ich habe gerade spring.security.user.name = <> spring.security.user.password = <> zur Datei application.properties hinzugefügt. Ich habe nichts anderes gemacht. Trotzdem hat es funktioniert.
Barani r
Sie haben Ihren Eigenschaftsnamen im XML-Beispiel falsch. Es ist spring.security.user.password = xxx. Wir sind uns auch nicht sicher über die XML-Formatierung, da wir .yml-Dateien verwenden
davidfrancis
Wenn inMemoryAuthenticationSie das verwenden, stellen Sie Ihrem Passwort lieber {noop} voran, wenn Sie die Fehlermeldung erhalten:There is no PasswordEncoder mapped for the id “null”
Martin van Wingerden
Fügen Sie dies in der SecurityConfig-Klasse hinzu. @Bean public PasswordEncoder passwordEncoder () {return NoOpPasswordEncoder.getInstance (); } Es kann behoben werden Es ist kein PasswordEncoder für die ID "null" zugeordnet
apss1943
9

Beim Überschreiben

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

In application.properties müssen Sie nicht "herum "username", sondern nur verwenden username. Ein weiterer Punkt: Anstatt ein unformatiertes Passwort zu speichern , verschlüsseln Sie es mit bcrypt / scrypt und speichern Sie es wie folgt

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

Wenn Sie das Kennwort nicht anhand anderer Antworten finden können, die auf ein Standardkennwort verweisen, wurde der Wortlaut der Protokollnachricht in den letzten Versionen in geändert

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

Sie können den Benutzer auch nach den Anmeldeinformationen fragen und diese dynamisch festlegen, sobald der Server gestartet wird (sehr effektiv, wenn Sie die Lösung in einer Kundenumgebung veröffentlichen müssen):

@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");
        }
    }
}

(Mai 2018) Ein Update - dies funktioniert auf Spring Boot 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
quelle
2

Ergänzung zur akzeptierten Antwort -

Wenn das Kennwort in den Protokollen nicht angezeigt wird, aktivieren Sie die Protokolle "org.springframework.boot.autoconfigure.security".

Wenn Sie Ihre Protokollierungskonfiguration optimieren, stellen Sie sicher, dass die Kategorie org.springframework.boot.autoconfigure.security so eingestellt ist, dass INFO-Nachrichten protokolliert werden. Andernfalls wird das Standardkennwort nicht gedruckt.

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

Ninad Pingale
quelle
0

Als ich anfing, Spring Security zu lernen, habe ich die Methode userDetailsService () wie im folgenden Codeausschnitt überschrieben :

@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);
    }
}

So können wir uns mit den oben genannten Creds bei der Anwendung anmelden. (zB admin / nimda)

Hinweis: Dies sollten wir nicht in der Produktion verwenden.

VicXj
quelle
0

Versuchen Sie, Benutzernamen und Passwort aus dem folgenden Code-Snipet in Ihrem Projekt zu übernehmen und sich anzumelden, und hoffen Sie, dass dies funktioniert.

@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
quelle