Tomcat ile Spring Boot'a başlarken kullanıcı adı ve şifre nedir?


147

Spring uygulamamı Spring Boot ve erişim yoluyla dağıttığımda localhost:8080kimlik doğrulamam gerekiyor, ancak kullanıcı adı ve şifre nedir veya nasıl ayarlayabilirim? Bunu dosyama eklemeye çalıştım tomcat-usersama işe yaramadı:

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

Bu uygulamanın başlangıç ​​noktasıdır:

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

Ve bu Tomcat bağımlılığı:

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

Nasıl kimlik doğrulaması yapabilirim localhost:8080?



Kimlik doğrulamanız gerekiyor = kimlik doğrulaması mı almak istiyorsunuz? Çünkü spring-boot-starter-tomcat / -web'de kimlik doğrulama veya kullanıcı adı ve şifre yoktur. Bazılarını görürseniz, muhtemelen farklı bir uygulama: 8080
zapl

2
Ve lansman sırasında konsolda basılıyor.
chrylis -koutiouslyoptimistic-

Yanıtlar:


297

Sınıf yolunuzda Spring Security olduğunu ve daha sonra spring security'un varsayılan kullanıcı ve oluşturulan şifre ile otomatik olarak yapılandırıldığını düşünüyorum

Lütfen pom.xml dosyanıza bakın:

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

Pom'nızda buna sahipseniz, böyle bir günlük konsolu mesajına sahip olmalısınız:

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

Tarayıcı komut isteminde kullanıcıyı userve konsolda yazdırılan şifreyi içe aktaracaksınız .

Veya bahar güvenliğini yapılandırmak istiyorsanız Spring Boot güvenli örneğine bakabilirsiniz.

Bu Bahar Boot açıklanmıştır Referans belgelerinde de Güvenlik bölümünde, gösteriyor:

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
Günlük yapılandırmanıza ince ayar yaparsanız, org.springframework.boot.autoconfigure.securitykategorinin INFO iletilerini günlüğe kaydedecek şekilde ayarlandığından emin olun , aksi takdirde varsayılan parola yazdırılmaz.
Zeeshan

güzel. her şey varsayılan bir şeydi. iki ucu keskin kılıç.
Sachin Sharma

1
benim durumum için (bahar önyükleme vs: 2.0.4) konsolu "oluşturulan güvenlik şifresi kullanma: eb7a9e02-b9cc-484d-9dec-a295b96d94ee"
Amir

Benim için de durum buydu. Bu konuda soru sormaya başlamak üzereydim.
Dmitriy Ryabin

@Marcel Sınıf yolunda yay güvenliğini ekledim ve oluşturulan şifreyi görebiliyorum. Yetkisizleşiyorum.
Lokesh Pandey

50

Eğer spring-securitykavanozlar sınıf yolunda eklenir ve bunun ise de spring-bootuygulama tüm http bitiş noktaları varsayılan güvenlik yapılandırma sınıfı tarafından sağlanacağınıSecurityAutoConfiguration

Bu, tarayıcı açılır penceresinin kimlik bilgilerini istemesine neden olur.

Her uygulamanın şifresi yeniden başlar ve konsolda bulunabilir.

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

Varsayılan uygulamaların önüne kendi uygulama güvenliği katmanınızı eklemek için,

@EnableWebSecurity
public class SecurityConfig {

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

veya yalnızca şifreyi değiştirmek isterseniz, varsayılan değeri geçersiz kılabilirsiniz,

application.xml

security.user.password = new_password

veya

application.properties

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

ben sadece spring.security.user.name = <> spring.security.user.password = <> application.properties dosyasına ekledim. Başka bir şey yapmadım. Yine de işe yaradı.
Barani r

Xml örneğinde mülk adınız yanlış Bu spring.security.user.password = xxx .yml dosyalarını kullandığımızda XML biçimlendirmesinden emin değilim
davidfrancis

Kullanırken inMemoryAuthenticationhatayı aldığınızda şifrenizi {noop} ile önek olarak kullanabilirsiniz:There is no PasswordEncoder mapped for the id “null”
Martin van Wingerden

bunu SecurityConfig sınıfına ekleyin @Bean public PasswordEncoder passwordEncoder () {return NoOpPasswordEncoder.getInstance (); }
Düzeltebilir

9

Geçersiz kılınırken

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

içinde application.properties , sana ihtiyacım yok "etrafında "username", sadece kullanım username. Başka bir nokta, ham şifreyi saklamak yerine, bcrypt / scrypt ile şifreleyin ve aşağıdaki gibi saklayın

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

3

Varsayılan yanıta işaret eden diğer cevaplara dayalı olarak şifreyi bulamazsanız, son sürümlerdeki günlük mesajı ifadeleri

Using generated security password: <some UUID>

2

Ayrıca kullanıcıdan kimlik bilgilerini isteyebilir ve sunucu başlatıldıktan sonra dinamik olarak ayarlayabilirsiniz (çözümü bir müşteri ortamında yayınlamanız gerektiğinde çok etkilidir):

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

(Mayıs 2018) Bir güncelleme - bu bahar önyükleme 2.x üzerinde çalışacaktır:

@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

Kabul edilen cevaba ekleme -

Günlüklerde şifre görünmüyorsa, "org.springframework.boot.autoconfigure.security" günlüklerini etkinleştirin.

Günlük yapılandırmanıza ince ayar yaparsanız, org.springframework.boot.autoconfigure.security kategorisinin INFO iletilerini günlüğe kaydedecek şekilde ayarlandığından emin olun, aksi takdirde varsayılan parola yazdırılmaz.

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


0

Spring Security öğrenmeye başladığımda , aşağıdaki kod snippet'indeki gibi userDetailsService () yöntemini geçersiz kıldım :

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

Böylece yukarıda belirtilen kredileri kullanarak uygulamada oturum açabiliriz. (ör. admin / nimda)

Not: Bu, üretimde kullanmamalıyız.


0

Projenizde aşağıdaki kod snipetinden kullanıcı adı ve şifre almaya çalışın ve giriş yapın ve umarım bu işe yarayacaktır.

@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);
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.