Apa nama pengguna dan kata sandi saat memulai Boot Musim Semi dengan Tomcat?

147

Ketika saya menggunakan aplikasi Spring saya melalui Spring Boot dan akses localhost:8080saya harus mengotentikasi, tetapi apa nama pengguna dan kata sandi atau bagaimana cara mengaturnya? Saya mencoba menambahkan ini ke tomcat-usersfile saya tetapi tidak berhasil:

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

Ini adalah titik awal aplikasi:

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

Dan ini adalah ketergantungan Tomcat:

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

Bagaimana cara saya mengotentikasi localhost:8080?

Gustavo
sumber
Dengan mengatur spring-boot-starter-security .
Elliott Frisch
Anda perlu mengautentikasi = Anda ingin memiliki otentikasi? Karena tidak ada otentikasi atau nama pengguna & kata sandi di spring-boot-starter-tomcat / -web. Jika Anda melihat beberapa, itu mungkin aplikasi yang berbeda pada: 8080
zapl
2
Dan itu dicetak pada konsol saat peluncuran.
chrylis -cautiouslyoptimistic-

Jawaban:

297

Saya pikir Anda memiliki Spring Security di jalur kelas Anda dan kemudian spring security secara otomatis dikonfigurasi dengan pengguna default dan kata sandi yang dihasilkan

Silakan lihat file pom.xml Anda untuk:

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

Jika Anda memilikinya di pom Anda daripada Anda harus memiliki pesan konsol log seperti ini:

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

Dan di browser prompt Anda akan mengimpor pengguna userdan kata sandi yang tercetak di konsol.

Atau jika Anda ingin mengkonfigurasi keamanan pegas Anda dapat melihat contoh aman Spring Boot

Dijelaskan dalam dokumentasi Referensi Boot Musim Semi di bagian Keamanan , ini menunjukkan:

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
sumber
23
Jika Anda memperbaiki konfigurasi logging Anda, pastikan bahwa org.springframework.boot.autoconfigure.securitykategori diatur untuk mencatat pesan INFO, jika tidak, kata sandi default tidak akan dicetak.
Zeeshan
Cantik. semuanya default ke sesuatu. pedang bermata dua.
Sachin Sharma
1
untuk kasus saya (spring boot vs: 2.0.4) konsol adalah "Menggunakan kata sandi keamanan yang dihasilkan: eb7a9e02-b9cc-484d-9dec-a295b96d94ee"
Amir
Ini juga terjadi pada saya. Saya baru saja akan mulai bertanya tentang hal itu.
Dmitriy Ryabin
@ Marscel Saya telah menambahkan keamanan musim semi di jalur kelas, dan dapat melihat kata sandi yang dihasilkan, Tapi ketika saya menggunakan auth dasar melalui tukang pos sebagai nama pengguna sebagai kata sandi dan kata sandi sebagai kata sandi yang dihasilkan. Saya menjadi tidak sah.
Lokesh Pandey
50

Jika spring-securityguci ditambahkan di classpath dan juga jika itu adalah spring-bootaplikasi semua titik akhir http akan diamankan oleh kelas konfigurasi keamanan defaultSecurityAutoConfiguration

Ini menyebabkan browser pop-up untuk meminta kredensial.

Kata sandi berubah untuk setiap aplikasi yang dimulai ulang dan dapat ditemukan di konsol.

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

Untuk menambahkan lapisan keamanan aplikasi Anda sendiri di depan default,

@EnableWebSecurity
public class SecurityConfig {

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

atau jika Anda hanya ingin mengubah kata sandi, Anda dapat mengganti default dengan,

application.xml

security.user.password = new_password

atau

properti aplikasi

spring.security.user.name=<>
spring.security.user.password=<>
Vino
sumber
saya baru saja menambahkan spring.security.user.name = <> spring.security.user.password = <> ke file application.properties. Saya tidak melakukan hal lain. Masih berhasil.
Barani r
Nama properti Anda salah dalam contoh xml. Ini spring.security.user.password = xxx Tidak yakin tentang pemformatan XML karena kami menggunakan file
.yml
Saat menggunakan inMemoryAuthenticationAnda lebih awalan kata sandi Anda dengan {noop} ketika Anda menerima kesalahan:There is no PasswordEncoder mapped for the id “null”
Martin van Wingerden
tambahkan ini di kelas SecurityConfig @Bean publik PasswordEncoder passwordEncoder () {return NoOpPasswordEncoder.getInstance (); } Ini dapat memperbaikinya. Tidak ada PasswordEncoder yang dipetakan untuk id “null”
apss1943
9

Saat mengesampingkan

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

di application.properties , Anda tidak perlu "berkeliling "username", cukup gunakan username. Hal lain, alih-alih menyimpan kata sandi mentah , mengenkripsi dengan bcrypt / scrypt dan menyimpannya seperti

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

Jika Anda tidak dapat menemukan kata sandi berdasarkan jawaban lain yang mengarah ke default, pesan log kata dalam versi terbaru diubah menjadi

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

Anda juga dapat meminta kredensial pengguna dan mengaturnya secara dinamis setelah server mulai (sangat efektif ketika Anda perlu mempublikasikan solusi pada lingkungan pelanggan):

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

(Mei 2018) Pembaruan - ini akan bekerja pada 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
sumber
2

Selain jawaban yang diterima -

Jika kata sandi tidak terlihat di log, aktifkan log "org.springframework.boot.autoconfigure.security".

Jika Anda memperbaiki konfigurasi logging Anda, pastikan bahwa kategori org.springframework.boot.autoconfigure.security diatur untuk mencatat pesan INFO, jika tidak, kata sandi default tidak akan dicetak.

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

Ninad Pingale
sumber
0

Ketika saya mulai belajar Spring Security, maka saya menimpa metode userDetailsService () seperti dalam cuplikan kode di bawah ini:

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

Jadi kita bisa masuk ke aplikasi menggunakan kredit yang disebutkan di atas. (mis. admin / nimda)

Catatan: Ini sebaiknya tidak kita gunakan dalam produksi.

VicXj
sumber
0

Cobalah untuk mengambil nama pengguna dan kata sandi dari snipet kode di bawah dalam proyek Anda dan login dan berharap ini akan berhasil.

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