ชื่อผู้ใช้และรหัสผ่านคืออะไรเมื่อเริ่มต้น Spring Boot ด้วย Tomcat


147

เมื่อฉันปรับใช้แอปพลิเคชัน Spring ผ่าน Spring Boot และการเข้าถึงlocalhost:8080ฉันต้องตรวจสอบสิทธิ์ แต่ชื่อผู้ใช้และรหัสผ่านคืออะไรฉันจะตั้งค่าได้อย่างไร ฉันพยายามที่จะเพิ่มลงในtomcat-usersไฟล์ของฉันแต่มันไม่ทำงาน:

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

นี่คือจุดเริ่มต้นของแอปพลิเคชัน:

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

และนี่คือการพึ่งพา Tomcat:

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

ฉันจะตรวจสอบความถูกต้องได้localhost:8080อย่างไร


โดยการตั้งค่าบูตเริ่มต้นการรักษาความปลอดภัยในฤดูใบไม้ผลิ
Elliott Frisch

คุณต้องพิสูจน์ตัวตน = คุณต้องการรับรองความถูกต้อง? เนื่องจากไม่มีการรับรองความถูกต้องหรือชื่อผู้ใช้และรหัสผ่านใน spring-boot-starter-tomcat / -web หากคุณเห็นบางอย่างอาจเป็นแอปพลิเคชันอื่นใน: 8080
zapl

2
และมันถูกพิมพ์บนคอนโซลเมื่อเปิดตัว
chrylis -cautiouslyoptimistic-

คำตอบ:


297

ฉันคิดว่าคุณมี Spring Security บนคลาสพา ธ ของคุณจากนั้น Spring security จะถูกกำหนดค่าโดยอัตโนมัติด้วยผู้ใช้เริ่มต้นและรหัสผ่านที่สร้าง

โปรดดูไฟล์ pom.xml ของคุณสำหรับ:

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

หากคุณมีสิ่งนั้นใน pom ของคุณมากกว่าที่คุณควรจะมีข้อความคอนโซลบันทึกดังนี้:

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

และในพรอมต์ของเบราว์เซอร์คุณจะนำเข้าผู้ใช้userและรหัสผ่านที่พิมพ์ในคอนโซล

หรือถ้าคุณต้องการกำหนดค่าความปลอดภัยสปริงคุณสามารถดูตัวอย่างการรักษาความปลอดภัยของ Spring Boot

มีการอธิบายไว้ในเอกสารอ้างอิง Spring Boot ในส่วนความปลอดภัยซึ่งระบุ:

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

23
หากคุณปรับแต่งการกำหนดค่าการบันทึกของคุณอย่างละเอียดตรวจสอบให้แน่ใจว่าorg.springframework.boot.autoconfigure.securityหมวดหมู่ถูกตั้งค่าให้บันทึกข้อความ INFO มิฉะนั้นรหัสผ่านเริ่มต้นจะไม่ถูกพิมพ์
Zeeshan

สวย. ทุกอย่างผิดนัดสิ่ง ดาบสองคม.
Sachin Sharma

1
สำหรับกรณีของฉัน (spring boot vs: 2.0.4) คอนโซลคือ "การใช้รหัสผ่านความปลอดภัยที่สร้างขึ้น: eb7a9e02-b9cc-484d-9dec-a295b96d94ee"
Amir

นี่เป็นเพียงกรณีสำหรับฉันเช่นกัน ฉันเพิ่งจะเริ่มถามคำถามเกี่ยวกับมัน
Dmitriy Ryabin

@ พัสดุฉันได้เพิ่มการรักษาความปลอดภัยในฤดูใบไม้ผลิในเส้นทางชั้นและสามารถดูรหัสผ่านที่สร้างขึ้น แต่เมื่อฉันใช้ในการตรวจสอบขั้นพื้นฐานผ่านบุรุษไปรษณีย์เป็นชื่อผู้ใช้ในฐานะผู้ใช้และรหัสผ่านเป็นรหัสผ่านที่สร้างขึ้น ฉันไม่ได้รับอนุญาต
Lokesh Pandey

50

หากspring-securityมีการเพิ่มไหใน classpath และหากเป็นspring-bootแอปพลิเคชันจุดปลาย http ทั้งหมดจะถูกรักษาความปลอดภัยโดยคลาสการกำหนดค่าความปลอดภัยเริ่มต้นSecurityAutoConfiguration

สิ่งนี้ทำให้เบราว์เซอร์ป๊อปอัปถามข้อมูลประจำตัว

การเปลี่ยนแปลงรหัสผ่านสำหรับแต่ละแอปพลิเคชันเริ่มต้นใหม่และสามารถพบได้ในคอนโซล

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

ในการเพิ่มเลเยอร์ความปลอดภัยของแอปพลิเคชันของคุณเองที่หน้าค่าเริ่มต้น

@EnableWebSecurity
public class SecurityConfig {

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

หรือหากคุณต้องการเปลี่ยนรหัสผ่านคุณสามารถแทนที่ค่าเริ่มต้นด้วย

application.xml

security.user.password = new_password

หรือ

application.properties

spring.security.user.name=<>
spring.security.user.password=<>

ฉันเพิ่งเพิ่ม spring.security.user.name = <> spring.security.user.password = <> ไปยังไฟล์ application.properties ฉันไม่ได้ทำอะไรเลย มันยังทำงานอยู่
Barani r

คุณมีชื่อคุณสมบัติของคุณไม่ถูกต้องในตัวอย่าง xml It's spring.security.user.password = xxx ไม่แน่ใจเกี่ยวกับการจัดรูปแบบ XML อย่างใดอย่างหนึ่งขณะที่เราใช้ไฟล์ .
yml

เมื่อใช้inMemoryAuthenticationคำนำหน้าคุณค่อนข้างใช้รหัสผ่านด้วย {noop} เมื่อคุณได้รับข้อผิดพลาด:There is no PasswordEncoder mapped for the id “null”
Martin van Wingerden

เพิ่มสิ่งนี้ในคลาส SecurityConfig @Bean สาธารณะ PasswordEncoder passwordEncoder () {return NoOpPasswordEncoder.getInstance (); } มันสามารถแก้ไขได้ไม่มีการ
เข้ารหัส

9

เมื่อเอาชนะ

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

ในapplication.propertiesคุณไม่จำเป็นต้อง"ไปรอบ ๆใช้เพียง"username" usernameอีกจุดหนึ่งแทนที่จะเก็บรหัสผ่านดิบเข้ารหัสด้วยbcrypt / scryptและเก็บไว้เหมือน

spring.security.user.password={bcrypt}encryptedPassword

3

หากคุณไม่พบรหัสผ่านตามคำตอบอื่น ๆ ที่ชี้ไปที่ค่าเริ่มต้นข้อความบันทึกข้อความในเวอร์ชันล่าสุดจะเปลี่ยนเป็น

Using generated security password: <some UUID>

2

คุณยังสามารถขอข้อมูลประจำตัวผู้ใช้และตั้งค่าแบบไดนามิกเมื่อเซิร์ฟเวอร์เริ่มต้น (มีประสิทธิภาพมากเมื่อคุณต้องการเผยแพร่โซลูชันบนสภาพแวดล้อมของลูกค้า):

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

(พฤษภาคม 2018) การอัปเดต - สิ่งนี้จะทำงานใน 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();
    }
}

2

นอกเหนือจากคำตอบที่ได้รับการยอมรับ -

หากไม่เห็นรหัสผ่านในบันทึกให้เปิดใช้งานล็อก "org.springframework.boot.autoconfigure.security"

หากคุณปรับแต่งการกำหนดค่าการบันทึกอย่างละเอียดตรวจสอบให้แน่ใจว่าหมวดหมู่ org.springframework.boot.autoconfigure.security ถูกตั้งค่าให้บันทึกข้อความ INFO มิฉะนั้นรหัสผ่านเริ่มต้นจะไม่ถูกพิมพ์

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


0

เมื่อฉันเริ่มเรียนรู้การรักษาความปลอดภัยของฤดูใบไม้ผลิจากนั้นฉันแทนที่วิธีการuserDetailsService ()ดังตัวอย่างโค้ดด้านล่าง:

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

ดังนั้นเราสามารถเข้าสู่แอปพลิเคชันโดยใช้เครดิตที่กล่าวถึงข้างต้น (เช่นผู้ดูแลระบบ / nimda)

หมายเหตุ: สิ่งนี้เราไม่ควรใช้ในการผลิต


0

ลองใช้ชื่อผู้ใช้และรหัสผ่านจากตัวอย่างรหัสด้านล่างในโครงการและการเข้าสู่ระบบของคุณและหวังว่าสิ่งนี้จะได้ผล

@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);
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.