2016-04-05 7 views
0

私はSpringSecurityに基づいた非常に簡単な認証システムを持っていて、見つかったものと全く同じです。here(もう少し複雑です)。SpringWebSecurity:欠落している理由の悪い証明書

しかし、ログオンプロシージャを実行すると、SpringSecurityはその構成に従ってBad Credentialsエラーをスローします。

実行時のユーザー名、パスワード、有効化された役割および役割がDBに格納されている内容に基づいているため、コードを見て、原因を見つけることができませんでした。したがって、私はそれが悪い構成や論理の問題から導き出されると思う。

ログによると、失敗する可能性があるのは:WARNING: Encoded password does not look like BCryptですが、すべての認証で正常に動作することがあります。

誰でも設定を調べるのに手伝ってもらえますか?ありがとう!!

package com.company.config; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
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.userdetails.UserDetailsService; 
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 
import org.springframework.security.crypto.password.PasswordEncoder; 

@Configuration 
@EnableWebSecurity 
public class AppSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    @Qualifier("userDetailsService") 
    UserDetailsService userDetailsService; 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{ 
     auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 
} 

@Bean 
public PasswordEncoder passwordEncoder() { 
    PasswordEncoder encoder = new BCryptPasswordEncoder(); 
    return encoder; 
} 


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

    http.authorizeRequests() 
      .antMatchers("**/admin/**").access("hasAnyRole('ROLE_ADMIN','ROLE_SUPERADMIN')") 
      .antMatchers("/superadmin/**").access("hasRole('ROLE_SUPERADMIN')") 
      .antMatchers("**/user/**").access("hasAnyRole('ROLE_USER','ROLE_ADMIN','ROLE_SUPERADMIN')") 
      .antMatchers("/resources/**").permitAll() 
      .antMatchers("/messages/**").permitAll() 
      .and() 
      .formLogin() 
       .loginPage("/login") 
       .usernameParameter("username") 
       .passwordParameter("password") 
       .defaultSuccessUrl("/user/home") 
       .failureUrl("/403") 
       .permitAll() 
      .and() 
       .exceptionHandling().accessDeniedPage("/403") 
      .and() 
       .logout().logoutUrl("/logout") 
      .and() 
       .csrf().disable(); 
    } 
} 

package com.company.service.impl; 

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.SimpleGrantedAuthority; 
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; 
import org.springframework.transaction.annotation.Transactional; 

import com.company.dao.UsuarioDao; 
import com.company.model.UserRole; 
import com.company.model.Usuario; 

@Service("userDetailsService") 
public class MyUserDetailsService implements UserDetailsService{ 

    @Autowired 
    private UsuarioDao usuarioDao; 


    @Transactional(readOnly=true) 
    public UserDetails loadUserByUsername(String username) 
      throws UsernameNotFoundException { 

     Usuario usuario = usuarioDao.findByChave(username); 
     List<GrantedAuthority> authorities = buildUserAuthority(usuario.getUserRole()); 

     return buildUserForAuthentication(usuario, authorities); 

    } 

    private User buildUserForAuthentication(Usuario user, 
     List<GrantedAuthority> authorities) { 

     User usr= new User(user.getUsername(), user.getPassword(), 
      user.isEnabled(), true, true, true, authorities); 

     System.out.println(usr.toString()); 
/* 
* Prints: [email protected]: 
* Username: SMITH; Password: [PROTECTED]; Enabled: true; 
* AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: 
* true; Not granted any authorities 
*/ 

     return usr; 

    } 

    private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles){ 

     Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>(); 

     // Build user's authorities 
     for (UserRole userRole : userRoles) { 
      setAuths.add(new SimpleGrantedAuthority(userRole.getRole())); 
     } 

     List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths); 

     return Result; 
    } 

} 
+2

:詳細については

は、それがこの質問と回答で見てみる価値がありますパスワードがeではないため、データベースから受け取ったものを意味しますxpected。エンコード、フィールドの長さを確認してください...実際の値を確認してください...明らかに正しいハッシュを保存していません。つまり、そのメッセージがあなたに伝えているものです。 –

+0

@ M.Deinum、問題が見つかりました。答えを見たいのであれば、それは貴重だと思います。興味がありがとう。 – Alex

答えて

0

いくつかの調査の後、私は問題を発見しました。私は既に第三者から提供された暗号化されたパスワードを扱っています。したがって、私はSpringSecurityが独自の暗号化(BCrypt)で動作していたのに対し、DBに直接格納していました。したがって、SpringSecurityは、問題を生成する2つの異なる文字列を作成していました(質問に記載されているWARNINGメッセージに良いヒントがあります)。

このようにして、私はAppSecurityConfigの@Bean PasswordEncoderを無効にしました(私は既に暗号化されたパスワードを扱っています)。その後、うまくいきました。あなたがそのメッセージを取得した場合は、それを

関連する問題