Spring Securityの認証の問題(パスワードではなくユーザー名のみをチェックしますか?)

chln

これはSpringでの最初のプロジェクトであり、SpringSecurityでログインを作成し始めたところです。一部のページには、管理者のみがアクセスでき、プレーヤーはアクセスできないようにします。Webでいくつかの例を見つけましたが、このメカニズムは非常にうまく機能します。ログインによって保護されているこの保護されたページがあり、ユーザーにROLE_ADMINがない場合は禁止されています。

@PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @GetMapping("/secured/all")
    public String securedHello() {
        return "Secured Hello";
    } 

問題は、コードをテストしたところ、Springが管理者(およびユーザーも)を認証するのはユーザー名のみをチェックしていることがわかったということです。間違ったパスワードを入力すると、とにかく入力できます。これがどのように可能かわかりませんが、Spring Securityはすべての認証を単独で機能させるべきではありませんか?誰かが認証マネージャーなどを実装するよう提案しているのを見たことがありますが、それをコードに挿入する理由と方法がわかりません。私は2日以来これに固執しています、どんなアドバイスでも本当に感謝します。これらは私のクラスです:

package model;
import java.io.IOException;
import javax.naming.AuthenticationException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.http.HttpStatus;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;

import com.fasterxml.jackson.databind.ObjectMapper;

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@EnableJpaRepositories(basePackageClasses = PlayersRepository.class)
@ComponentScan(basePackageClasses= CustomUserDetailsService.class)
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.userDetailsService(userDetailsService)
        .passwordEncoder(getPasswordEncoder());
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("**/secured/**").access("hasAuthority('ROLE_ADMIN')")
                .anyRequest().permitAll()
                .and()
                    .formLogin().permitAll();

    }

    private PasswordEncoder getPasswordEncoder() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence charSequence) {
                return charSequence.toString();
            }

            @Override
            public boolean matches(CharSequence charSequence, String s) {
                return true;
            }
        };
    }
}


package model;

import java.util.ArrayList;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class CustomUserDetailsService implements UserDetailsService {


    @Autowired
    private PlayersRepository usersRepository;
    @Autowired
    private RoleRepository rolesRepository;

    public CustomUserDetailsService(PlayersRepository usersRepository, RoleRepository rolesRepository) {
        this.usersRepository=usersRepository;
        this.rolesRepository=rolesRepository;
    }
 @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<Player> optionalUser = usersRepository.findByUsername(username);

        optionalUser
                .orElseThrow(() -> new UsernameNotFoundException("Username not found"));
        Player user= optionalUser.get();
        System.out.println(user);
        return  toUserDetails(new UserObject(user.getUsername(),user.getPassword(),user.getRole()));
    }



    private UserDetails toUserDetails(UserObject userObject) {
        return User.withUsername(userObject.name)
                   .password(userObject.password)
                   .roles(userObject.role).build();
    }

    private static class UserObject {
        private String name;
        private String password;
        private String role;

        public UserObject(String name, String password, String role) {
            this.name = name;
            this.password = password;
            this.role = role;
        }
    }

}



package model;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class CustomUserDetails extends Player implements UserDetails {


    String role;

    public CustomUserDetails(final Player user) {
        super(user);
    }

    public CustomUserDetails(Optional<Player> user, String role) {
        super(user);
        this.role=role;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();

        list.add(new SimpleGrantedAuthority("ROLE_"+ role));

        System.out.println(list); 
        return list;
    }

    @Override
    public String getPassword() {
        return super.getPassword();
    }

    @Override
    public String getUsername() {
        return super.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }


}
g00glen00b

Spring Securityはすべての認証を単独で機能させるべきではありませんか?

はい、SpringSecurityはを使用してそれを行いますAuthenticationManager

誰かが認証マネージャーなどを実装するよう提案しているのを見たことがありますが、それをコードに挿入する理由と方法がわかりません。

メソッドAuthenticationManager内でビルドしたので、実際にはすでにがありますconfigure()

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(getPasswordEncoder());
}

だから、これが機能しない正確な理由は何ですか?さて、AuthenticationManagerあなたが提供したものには2つの部分が含まれています。

  1. ユーザー情報を取得する部分(CustomUserDetailsService
  2. パスワードをチェックする別の部分(getPasswordEncoder())。

画面の背後で発生するのは、SpringがあなたCustomUserDetailsService電話をかけて、(ハッシュされた)パスワードを含むユーザー情報を取得することです。その情報を取得した後、PasswordEncoder.matches()関数を呼び出して、入力された生のパスワードが、によって提供されたハッシュされたパスワードと一致するかどうかを確認しますCustomUserDetailsService

あなたの場合、PasswordEncoder.matches()関数は次のようになります。

@Override
public boolean matches(CharSequence charSequence, String s) {
    return true;
}

これは、指定したパスワードに関係なく、を返すことを意味しますtrueどのパスワードでも機能するので、これはまさにあなたが経験していることです。

では、これをどのように解決しますか?さて、あなたPasswordEncoderは実際にあなたの生のパスワードをハッシュし、それを渡されているハッシュされたパスワードと比較するべきです、例えば:

@Override
public boolean matches(CharSequence rawPassword, String hashedPassword) {
    String hashedPassword2 = null; // hash your rawPassword here
    return hashedPassword2.equals(hashedPassword);
}

このメソッドの実装は、データベースにパスワードを保存する方法によって異なります。春のセキュリティはすでに含めて、いくつかの実装が付属していますBcryptPasswordEncoderStandardPasswordEncoderMessageDigestPasswordEncoder、...。これらの実装の一部は非推奨です。これは主に、これらのエンコーダーで使用されるハッシュメカニズムが安全でないと見なされていることを示すためです。Javadocで言及されているように、現時点では、これらのエンコーダーを削除する予定はありません。

ダイジェストベースのパスワードエンコーディングは安全とは見なされません。代わりのような適応1の一方向関数を使用しBCryptPasswordEncoderPbkdf2PasswordEncoderまたはSCryptPasswordEncoderDelegatingPasswordEncoderパスワードのアップグレードをサポートするさらに良い使用法このサポートを削除する予定はありません。これがレガシー実装であり、それを使用することは安全でないと見なされることを示すことは非推奨です。

(強調は私自身のものです)

選択する実装を自由に選択できる場合はBCryptPasswordEncoderJavadocで説明されいるようにSpringを使用することをお勧めします

パスワードをエンコードするためのサービスインターフェイス。推奨される実装はBCryptPasswordEncoderです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spring Security認証は1つのユーザー名とパスワードでのみ機能します

分類Dev

Spring Securityでのユーザー名パスワード認証

分類Dev

Spring Securityを使用して、ユーザー名とパスワードではなくIDとパスワードでユーザーを認証する方法

分類Dev

Spring Securityは、認証済みユーザーと非認証ユーザーのRESTサービスでユーザー情報を取得します

分類Dev

ユーザー名とパスワードだけでなく、3つのフィールドを使用したSpringセキュリティ認証

分類Dev

Spring Security Oauth2リソース所有者のパスワードフロー:RESTリクエストを送信すると、ユーザー詳細サービスは常にユーザー名ではなくクライアントIDを取得します

分類Dev

Spring Securityのファイルからユーザー名/パスワードを読み取る

分類Dev

Spring Eurekaがユーザー名とパスワードの認証を要求する

分類Dev

Spring Security:サーブレットフィルター内の現在の認証済みユーザーにアクセスします

分類Dev

Spring Security:inMemoryAuthenticationで使用されるユーザー名とパスワードを更新/再読み込みするにはどうすればよいですか?

分類Dev

Spring Security:特定の役割を持たない限り、すべての完全認証済みユーザーにページビューを許可します

分類Dev

Spring Securityのgetprincipal()メソッドは、クラスUserDetailsの代わりに文字列(ユーザー名)を返します

分類Dev

Spring Securityは、UserDetailsを実装する2つのメソッドから現在のユーザーオブジェクトを取得します

分類Dev

Spring Security 3-ユーザー名/パスワードのパラメーターをカスタマイズする方法は?

分類Dev

Springセキュリティでは、特定のユーザー名を持つユーザーのみにアクセスを許可します

分類Dev

Springセキュリティでは、特定のユーザー名を持つユーザーのみにアクセスを許可します

分類Dev

Spring SecurityとMarkLogicのJavaクライアントAPIを介してユーザーを認証する方法は?

分類Dev

Spring Security Oauth2の認証コードからアクセストークンがフェッチされていませんか?アクセストークンの呼び出しが失敗し、ERR_TOO_MANY_REDIRECTSが発生しますか?

分類Dev

Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

分類Dev

Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

分類Dev

Spring Securityをプロジェクトに正しく追加していますか?認証後のアクセスエラー

分類Dev

Spring Securityのメモリ内のユーザーをリストしますか?

分類Dev

Spring Boot、Spring Security、MySQL-CustomUserDetailsServiceは常に「無効なユーザー名またはパスワード」というエラーになります

分類Dev

ヘッダーで渡されたpingアクセスとユーザー名を使用してSpringセキュリティを使用して事前認証されたLDAPユーザーを認証するにはどうすればよいですか?

分類Dev

Spring Bootで自動生成されたパスワードとユーザーを無効にできないのはなぜですか?

分類Dev

このSpringSecurityの実装が、ユーザー名ではなくパスワードのみをチェックするのはなぜですか?

分類Dev

Spring Security-ユーザーとロールに別々のクラスがあるのはなぜですか?

分類Dev

Spring Security-認証時に明確なパスワードを取得し、それらを再暗号化します

分類Dev

Spring SecurityでJavaコードの「hasRole」をチェックする方法は?

Related 関連記事

  1. 1

    Spring Security認証は1つのユーザー名とパスワードでのみ機能します

  2. 2

    Spring Securityでのユーザー名パスワード認証

  3. 3

    Spring Securityを使用して、ユーザー名とパスワードではなくIDとパスワードでユーザーを認証する方法

  4. 4

    Spring Securityは、認証済みユーザーと非認証ユーザーのRESTサービスでユーザー情報を取得します

  5. 5

    ユーザー名とパスワードだけでなく、3つのフィールドを使用したSpringセキュリティ認証

  6. 6

    Spring Security Oauth2リソース所有者のパスワードフロー:RESTリクエストを送信すると、ユーザー詳細サービスは常にユーザー名ではなくクライアントIDを取得します

  7. 7

    Spring Securityのファイルからユーザー名/パスワードを読み取る

  8. 8

    Spring Eurekaがユーザー名とパスワードの認証を要求する

  9. 9

    Spring Security:サーブレットフィルター内の現在の認証済みユーザーにアクセスします

  10. 10

    Spring Security:inMemoryAuthenticationで使用されるユーザー名とパスワードを更新/再読み込みするにはどうすればよいですか?

  11. 11

    Spring Security:特定の役割を持たない限り、すべての完全認証済みユーザーにページビューを許可します

  12. 12

    Spring Securityのgetprincipal()メソッドは、クラスUserDetailsの代わりに文字列(ユーザー名)を返します

  13. 13

    Spring Securityは、UserDetailsを実装する2つのメソッドから現在のユーザーオブジェクトを取得します

  14. 14

    Spring Security 3-ユーザー名/パスワードのパラメーターをカスタマイズする方法は?

  15. 15

    Springセキュリティでは、特定のユーザー名を持つユーザーのみにアクセスを許可します

  16. 16

    Springセキュリティでは、特定のユーザー名を持つユーザーのみにアクセスを許可します

  17. 17

    Spring SecurityとMarkLogicのJavaクライアントAPIを介してユーザーを認証する方法は?

  18. 18

    Spring Security Oauth2の認証コードからアクセストークンがフェッチされていませんか?アクセストークンの呼び出しが失敗し、ERR_TOO_MANY_REDIRECTSが発生しますか?

  19. 19

    Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

  20. 20

    Spring Security Java構成は、認証されたソースでのみ使用可能なJSPへのアクセス要求をインターセプトしません

  21. 21

    Spring Securityをプロジェクトに正しく追加していますか?認証後のアクセスエラー

  22. 22

    Spring Securityのメモリ内のユーザーをリストしますか?

  23. 23

    Spring Boot、Spring Security、MySQL-CustomUserDetailsServiceは常に「無効なユーザー名またはパスワード」というエラーになります

  24. 24

    ヘッダーで渡されたpingアクセスとユーザー名を使用してSpringセキュリティを使用して事前認証されたLDAPユーザーを認証するにはどうすればよいですか?

  25. 25

    Spring Bootで自動生成されたパスワードとユーザーを無効にできないのはなぜですか?

  26. 26

    このSpringSecurityの実装が、ユーザー名ではなくパスワードのみをチェックするのはなぜですか?

  27. 27

    Spring Security-ユーザーとロールに別々のクラスがあるのはなぜですか?

  28. 28

    Spring Security-認証時に明確なパスワードを取得し、それらを再暗号化します

  29. 29

    Spring SecurityでJavaコードの「hasRole」をチェックする方法は?

ホットタグ

アーカイブ