2017-01-29 46 views
0

我的問題產生了this tutorial春季啓動,春季安全,MySQL的 - CustomUserDetailsS​​ervice總是導致錯誤「無效的用戶名或密碼」

我的問題是,我總是在我的用戶被從數據庫中讀出的問題上運行,但是我沒有得到認證。在視圖上,它總是顯示錯誤消息「無效的用戶名或密碼」。我的控制檯輸出顯示沒有錯誤。當我通過身份驗證過程進行調試時,沒有不明確的行爲,錯誤可能來自於此。

在我的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(); 
    } 
} 

正如我之前提到的,我不認爲是錯誤的數據庫上occures。我在教程中使用了數據庫方案。我還使用User.java UserRole.java和本教程以外的兩個存儲庫。

我的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 /主/資源/ application.properties來支持你的數據庫。我包含了我用來創建數據庫表的sql腳本。

+0

請分享您的源代碼嗎?來自給定教程的應用程序無法正常工作,它抱怨錯過的頁面等。 –

+0

感謝您的回覆,我添加了git項目的鏈接。 – sttzP

回答

0

我已經加入該行

logging.level.=TRACE 

啓用了application.properties跟蹤記錄並在控制檯中看到的錯誤消息

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

您的自定義用戶詳細信息類de.dhbw.stuttgart.speeddating.userhandling.service.impl.CustomUserDetails返回 「」,從 「isAccountNonExpired」, 「isAccountNonLocked」 和方法「isCredentialsNonExpired 」。我想這些方法應該返回dedhbw.stuttgart.speeddating.userhandling.service.User的屬性「enabled」的值。

將所有這些「false」更改爲「true」後,登錄過程開始按預期工作。

+0

這就是解決方案。非常感謝你! – sttzP