Tên người dùng và mật khẩu khi bắt đầu Spring Boot với Tomcat là gì?


146

Khi tôi triển khai ứng dụng Spring của mình thông qua Spring Boot và truy cập localhost:8080 tôi phải xác thực, nhưng tên người dùng và mật khẩu là gì hoặc làm cách nào tôi có thể đặt nó? Tôi đã cố gắng thêm nó vào tomcat-userstập tin của mình nhưng nó không hoạt động:

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

Đây là điểm khởi đầu của ứng dụng:

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

Và đây là sự phụ thuộc của Tomcat:

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

Làm thế nào để tôi xác thực trên localhost:8080?


Bằng cách thiết lập bảo mật spring-boot-starter .
Elliott Frisch

Bạn cần xác thực = bạn muốn có xác thực? Bởi vì không có xác thực cũng như tên người dùng và mật khẩu trong spring-boot-starter-tomcat / -web. Nếu bạn thấy một số, có lẽ đó là một ứng dụng khác vào: 8080
zapl 17/05/2016

2
Và nó được in trên bàn điều khiển khi ra mắt.
chrylis -cautiouslyoptimistic-

Câu trả lời:


296

Tôi nghĩ rằng bạn có Spring Security trên đường dẫn lớp của mình và sau đó bảo mật mùa xuân được cấu hình tự động với một người dùng mặc định và mật khẩu được tạo

Vui lòng xem tệp pom.xml của bạn để biết:

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

Nếu bạn có trong pom của bạn hơn bạn nên có một thông báo bảng điều khiển nhật ký như thế này:

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

Và trong lời nhắc của trình duyệt, bạn sẽ nhập người dùng uservà mật khẩu được in trong bảng điều khiển.

Hoặc nếu bạn muốn định cấu hình bảo mật mùa xuân, bạn có thể xem ví dụ bảo mật Spring Boot

Nó được giải thích trong tài liệu Tham khảo khởi động mùa xuân trong phần Bảo mật , nó chỉ ra:

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
Nếu bạn tinh chỉnh cấu hình ghi nhật ký của mình, hãy đảm bảo rằng org.springframework.boot.autoconfigure.securitydanh mục được đặt để ghi thông báo INFO, nếu không mật khẩu mặc định sẽ không được in.
Zeeshan

xinh đẹp. mọi thứ mặc định là một cái gì đó con dao hai lưỡi.
Sachin Sharma

1
đối với bảng điều khiển của tôi (spring boot vs: 2.0.4) là "Sử dụng mật khẩu bảo mật được tạo: eb7a9e02-b9cc-484d-9dec-a295b96d94ee"
Amir

Đây chỉ là trường hợp cho tôi quá. Tôi vừa mới bắt đầu đặt câu hỏi về nó.
Dmitriy Ryabin

50

Nếu spring-securitycác tệp được thêm vào trong đường dẫn lớp và nếu đó là spring-bootứng dụng thì tất cả các điểm cuối http sẽ được bảo mật theo lớp cấu hình bảo mật mặc địnhSecurityAutoConfiguration

Điều này khiến một trình duyệt bật lên để yêu cầu thông tin đăng nhập.

Mật khẩu thay đổi cho mỗi ứng dụng khởi động lại và có thể được tìm thấy trong bảng điều khiển.

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

Để thêm lớp bảo mật ứng dụng của riêng bạn trước các giá trị mặc định,

@EnableWebSecurity
public class SecurityConfig {

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

hoặc nếu bạn chỉ muốn thay đổi mật khẩu, bạn có thể ghi đè mặc định bằng,

ứng dụng

bảo mật.user.password = new_password

hoặc là

ứng dụng

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

tôi vừa thêm spring.security.user.name = <> spring.security.user.password = <> vào tệp application.properIES. Tôi không làm gì khác. Nó vẫn hoạt động.
Barani r

Bạn có tên thuộc tính sai trong ví dụ xml Đó là spring.security.user.password = xxx Không chắc chắn về định dạng XML khi chúng tôi sử dụng các tệp
.yml

Khi sử dụng inMemoryAuthenticationtiền tố thay vì mật khẩu của bạn với {noop} khi bạn gặp lỗi:There is no PasswordEncoder mapped for the id “null”
Martin van Wingerden

thêm phần này vào lớp SecurityConfig @Bean public PasswordEncoder passwordEncoder () {return NoOpPasswordEncoder.getInstance (); } Nó có thể sửa chữa Không có PasswordEncoder được ánh xạ cho id Id null null
apss1943

9

Khi ghi đè

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

trong application.properations , bạn không cần "xung quanh "username", chỉ cần sử dụng username. Một điểm khác, thay vì lưu trữ mật khẩu thô , hãy mã hóa nó bằng bcrypt / scrypt và lưu trữ nó như

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

3

Nếu bạn không thể tìm thấy mật khẩu dựa trên các câu trả lời khác trỏ đến mật khẩu mặc định, từ ngữ thông điệp tường trình trong các phiên bản gần đây đã thay đổi thành

Using generated security password: <some UUID>

2

Bạn cũng có thể yêu cầu người dùng cung cấp thông tin đăng nhập và thiết lập chúng một cách linh hoạt khi máy chủ khởi động (rất hiệu quả khi bạn cần xuất bản giải pháp trên môi trường khách hàng):

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

(Tháng 5 năm 2018) Một bản cập nhật - điều này sẽ hoạt động trên 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

Ngoài câu trả lời được chấp nhận -

Nếu mật khẩu không được nhìn thấy trong nhật ký, hãy bật nhật ký "org.springframework.boot.autoconfigure.security".

Nếu bạn tinh chỉnh cấu hình ghi nhật ký của mình, hãy đảm bảo rằng danh mục org.springframework.boot.autoconfigure.security được đặt để ghi thông báo INFO, nếu không mật khẩu mặc định sẽ không được in.

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


0

Khi tôi bắt đầu học Spring Security, sau đó tôi đã ghi đè phương thức userDetailsService () như trong đoạn mã dưới đây:

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

Vì vậy, chúng tôi có thể đăng nhập vào ứng dụng bằng cách sử dụng các khoản tín dụng nêu trên. (ví dụ: quản trị viên / nimda)

Lưu ý: Điều này chúng ta không nên sử dụng trong sản xuất.


0

Hãy thử lấy tên người dùng và mật khẩu từ đoạn mã dưới đây trong dự án của bạn và đăng nhập và hy vọng điều này sẽ hoạt động.

@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);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.