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

sttzP

私がこのチュートリアルから生じた問題

私の問題は、ユーザーがデータベースから読み取られるという問題が常に発生することですが、認証されません。ビューには、常に「無効なユーザー名またはパスワード」というエラーメッセージが表示されます。私のコンソール出力にエラーは表示されません。認証プロセスを介してデバッグしたとき、エラーの原因となる可能性のある不明確な動作はありませんでした。

私のpom.xmlでは、次の依存関係を使用しました。

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
  </dependencies>

私のCustomUserDetailsS​​ervice.javaは次のようになります。

@Service("customUserDetailsService")
public class CustomUserDetailsService implements UserDetailsService {

    private final UserRepository userRepository;
    private final UserRolesRepository userRolesRepository;

    @Autowired
    public CustomUserDetailsService(UserRepository userRepository,
            UserRolesRepository userRolesRepository) {

        this.userRepository = userRepository;
        this.userRolesRepository = userRolesRepository;

    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User user = userRepository.findByUserName(username);

        if (user == null) {
            throw new UsernameNotFoundException("No user present with username " + username);
        }
        else {
            List<String> userRoles = userRolesRepository.findRoleByUserName(username);
            return new CustomUserDetails(user, userRoles);
        }

    }

}

CustomUserDetails.java

    public class CustomUserDetails extends User implements UserDetails {

    private static final long serialVersionUID = 1L;
    private List<String> userRoles;

    public CustomUserDetails(User user, List<String> userRoles) {

        super(user);
        this.userRoles = userRoles;

    }

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

        String roles = StringUtils.collectionToCommaDelimitedString(userRoles);

        return AuthorityUtils.commaSeparatedStringToAuthorityList(roles);
    }

    @Override
    public boolean isAccountNonExpired() {

        return false;
    }

    @Override
    public boolean isAccountNonLocked() {

        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {

        return false;
    }
}

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {

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

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

        http.authorizeRequests()
                .antMatchers("/", "/home", "/images/**", "/css/**", "/js/**", "/loadEvents")
                .permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login")
                .permitAll().and().logout().permitAll();
    }

    @Bean(name = "passwordEncoder")
    public PasswordEncoder passwordencoder() {

        return new BCryptPasswordEncoder();
    }
}

前に述べたように、データベースでエラーが発生するとは思わない。チュートリアルからデータベーススキームを使用しました。また、チュートリアルからUser.javaUserRole.javaと2つのリポジトリを使用しました。

私のApplication.javaは次のようになります。

@SpringBootApplication
@EnableJpaRepositories(basePackages = "<package>")
@EntityScan(basePackages = "<package>")
public class Application {

    public static void main(String[] args) throws Throwable {

        SpringApplication.run(Application.class, args);
    }

}

アップデート1:Gitプロジェクトへのリンク https://github.com/pStuetz/Speeddating4SO/tree/master

データベースをサポートするには、src / main / resources /application.propertiesを編集する必要があるかもしれません。データベーステーブルの作成に使用したSQLスクリプトを含めました。

Igor Bljahhin

この行を追加して、application.propertiesでトレースログを有効にしました

logging.level.=TRACE

エラーメッセージが表示されました

org.springframework.security.authentication.LockedException: User account is locked

コンソールで。

カスタムユーザー詳細クラスde.dhbw.stuttgart.speeddating.userhandling.service.impl.CustomUserDetails、メソッド「isAccountNonExpired」、「isAccountNonLocked」、および「isCredentialsNonExpiredからfalse」を返しますメソッドは、クラスde.dhbw.stuttgart.speeddating.userhandling.service.Userからプロパティ「enabled」の値を返す必要があると思います。

これらすべての「false」を「true」に変更した後、ログイン手順は期待どおりに機能し始めました。

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

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

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ