Що таке ім’я користувача та пароль при запуску 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?



Вам потрібно пройти автентифікацію = ви хочете мати автентифікацію? Оскільки у Spring-boot-starter-tomcat / -web немає автентифікації, а також ім’я користувача та пароля. Якщо ви бачите деяких, це, мабуть, інша програма на: 8080
zapl

2
І друкується на консолі при запуску.
хриліс -обережнооптимістично-

Відповіді:


297

Я думаю, що у вас на шляху до класу є Spring Security, а потім безпека весни автоматично налаштовується з користувачем за замовчуванням та генерується паролем

Загляньте у файл pom.xml для:

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

Якщо у вас це є в пам’яті, ви повинні мати таке повідомлення консолі журналу:

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

І у вікні браузера ви імпортуєте користувача userта пароль, надруковані на консолі.

Або якщо ви хочете налаштувати безпеку весни, ви можете переглянути приклад із захищеною системою 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-повідомлень, інакше пароль за замовчуванням не буде надруковано.
Зеешан

гарний. все дефолт. дворізний меч.
Сахін Шарма

1
для мого випадку (весняний завантажувач vs: 2.0.4) консоль - "Використання згенерованого пароля безпеки: eb7a9e02-b9cc-484d-9dec-a295b96d94ee"
Амір

Так було і для мене. Я ось-ось почав ставити питання про це.
Дмитро

@Marcel Я додав весняний захист на шляху до класу, і я бачу згенерований пароль, але коли я використовую базовий auth через листоношу як ім'я користувача, а пароль як генерований пароль. Я отримую несанкціонований доступ.
Локеш Пандей

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

або

застосування.властивості

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

Я щойно додав spring.security.user.name = <> spring.security.user.password = <> у файл application.properties. Я нічого іншого не робив. Все-таки це спрацювало.
Barani r

У прикладі xml у вас неправильне ім’я власності. Це Spring.security.user.password = xxx Не впевнений у форматуванні XML, як ми використовуємо файли
.yml

Під час використання inMemoryAuthenticationви скоріше префіксуйте свій пароль на {noop}, коли отримуєте помилку:There is no PasswordEncoder mapped for the id “null”
Martin van Wingerden

додайте це у клас SecurityConfig @Bean public PasswordEncoder passwordEncoder () {return NoOpPasswordEncoder.getInstance (); } Це може виправити. Немає пароля, який відображається для ідентифікатора "null"
apss1943,

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 р.) Оновлення - це буде працювати над весняним завантаженням 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

Коли я почав вивчати Spring Security, я переосмислив метод 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);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.