Codé mot de passe ne ressemble pas à BCrypt
Je suis à l'aide de Spring Boot, le Printemps de Sécurité, OAuth2 et JWT pour authentifier ma demande, mais je reçois cette erreur méchante et je n'ai pas la moindre idée de ce qui est mal. Mon CustomDetailsService
classe:
@Service
public class CustomDetailsService implements UserDetailsService {
private static final Logger logger = LoggerFactory.getLogger(CustomDetailsService.class);
@Autowired
private UserBO userBo;
@Autowired
private RoleBO roleBo;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
AppUsers appUsers = null;
try {
appUsers = this.userBo.loadUserByUsername(username);
System.out.println("========|||=========== "+appUsers.getUsername());
}catch(IndexOutOfBoundsException e){
throw new UsernameNotFoundException("Wrong username");
}catch(DataAccessException e){
e.printStackTrace();
throw new UsernameNotFoundException("Database Error");
}catch(Exception e){
e.printStackTrace();
throw new UsernameNotFoundException("Unknown Error");
}
if(appUsers == null){
throw new UsernameNotFoundException("Bad credentials");
}
logger.info("Username: "+appUsers.getUsername());
return buildUserFromUserEntity(appUsers);
}
private User buildUserFromUserEntity(AppUsers authUsers) {
Set<UserRole> userRoles = authUsers.getUserRoles();
boolean enabled = true;
boolean accountNotExpired = true;
boolean credentialsNotExpired = true;
boolean accountNotLocked = true;
if (authUsers.getAccountIsActive()) {
try {
if(authUsers.getAccountExpired()){
accountNotExpired = true;
} else if (authUsers.getAccountIsLocked()) {
accountNotLocked = true;
} else {
if (containsRole((userRoles), roleBo.findRoleByName("FLEX_ADMIN"))){
accountNotLocked = false;
}
}
}catch(Exception e){
enabled = false;
e.printStackTrace();
}
}else {
accountNotExpired = false;
}
//convert model user to spring security user
String username = authUsers.getUsername();
String password = authUsers.getPassword();
List<GrantedAuthority> authorities = buildUserAuthority(userRoles);
User springUser = new User(username, password,enabled, accountNotExpired, credentialsNotExpired, accountNotLocked, authorities);
return springUser;
}
}
OAuth2Config
:
@Configuration
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Bean
public JwtAccessTokenConverter tokenConverter() {
JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
tokenConverter.setSigningKey(PRIVATE_KEY);
tokenConverter.setVerifierKey(PUBLIC_KEY);
return tokenConverter;
}
@Bean
public JwtTokenStore tokenStore() {
return new JwtTokenStore(tokenConverter());
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpointsConfigurer) throws Exception {
endpointsConfigurer.authenticationManager(authenticationManager)
.tokenStore(tokenStore())
.accessTokenConverter(tokenConverter());
}
@Override
public void configure(AuthorizationServerSecurityConfigurer securityConfigurer) throws Exception {
securityConfigurer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient(CLIENT_ID)
.secret(CLIENT_SECRET)
.scopes("read","write")
.authorizedGrantTypes("password","refresh_token")
.accessTokenValiditySeconds(20000)
.refreshTokenValiditySeconds(20000);
}
}
SecurityConfig
:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomDetailsService customDetailsService;
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
@Override
@Autowired
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(customDetailsService).passwordEncoder(encoder());
System.out.println("Done...finito");
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.NEVER);
}
@Override
@Bean
public AuthenticationManager authenticationManager() throws Exception {
return super.authenticationManagerBean();
}
}
Pas de message d'erreur, sauf:
Hibernate: select appusers0_.id as id1_2_, appusers0_.account_expired as account_2_2_, appusers0_.account_is_active as account_3_2_, appusers0_.account_is_locked as account_4_2_, appusers0_.bank_acct as bank_acc5_2_, appusers0_.branch_id as branch_i6_2_, appusers0_.bvn as bvn7_2_, appusers0_.create_date as create_d8_2_, appusers0_.created_by as created_9_2_, appusers0_.email as email10_2_, appusers0_.email_verified_code as email_v11_2_, appusers0_.gender as gender12_2_, appusers0_.gravatar_url as gravata13_2_, appusers0_.is_deleted as is_dele14_2_, appusers0_.lastname as lastnam15_2_, appusers0_.middlename as middlen16_2_, appusers0_.modified_by as modifie17_2_, appusers0_.modified_date as modifie18_2_, appusers0_.orgnization_id as orgniza19_2_, appusers0_.password as passwor20_2_, appusers0_.phone_no as phone_n21_2_, appusers0_.surname as surname22_2_, appusers0_.token_expired as token_e23_2_, appusers0_.username as usernam24_2_ from users appusers0_ where appusers0_.username=?
Tinubu
2018-03-31 01:42:03.255 INFO 4088 --- [nio-8072-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-03-31 01:42:03.255 INFO 4088 --- [nio-8072-exec-2] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2018-03-31 01:42:03.281 INFO 4088 --- [nio-8072-exec-2] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 26 ms
2018-03-31 01:42:03.489 WARN 4088 --- [nio-8072-exec-2] o.s.s.c.bcrypt.BCryptPasswordEncoder : Encoded password does not look like BCrypt
Mon modèle d'entité classes sont:
@Entity
@Table(name="USERS")
@DynamicUpdate
public class AppUsers {
@Id
@Column(name="ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty(notes = "The user auto generated identity", required = true)
private Long id;
@Column(name="username")
@ApiModelProperty(notes = "The username parameter", required = true)
private String username;
@Column(name="password")
@ApiModelProperty(notes = "The password parameter", required = true)
private String password;
@JsonManagedReference
@OneToMany(mappedBy="appUsers")
private Set<UserRole> userRoles;
'''''' setters and getters
}
Role
entité:
@Entity
@Table(name="ROLE")
public class Role {
@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id", unique = true, nullable = false)
private Long Id;
@Column(name = "name")
private String roleName;
@JsonManagedReference
@OneToMany(mappedBy="role")
private Set<UserRole> userRoles;
//getters and setters
}
UserRole
entité:
@Entity
@Table(name="USER_ROLE")
@DynamicUpdate
public class UserRole implements Serializable {
private static final long serialVersionUID = 6128016096756071383L;
@Id
@Column(name="ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ApiModelProperty(notes = "The userrole auto generated identity", required = true)
private long id;
@JsonBackReference
@ManyToOne//(fetch=FetchType.LAZY)
private AppUsers appUsers;
@JsonBackReference
@ManyToOne//(fetch=FetchType.LAZY)
private Role role;
//getters and setters
}
Mon mot de passe dans la base de données est correctement chiffré Printemps de sécurité BCrypt et il type de données est de type varchar(255) qui est supérieure à 60.
- Hyoung Hong.. Le code a bien fonctionné jusqu'à ce que j'ai besoin de passer les informations d'authentification. la seule erreur qu'elle jette est: (Codée mot de passe ne ressemble pas à BCrypt)
Vous devez vous connecter pour publier un commentaire.
BCryptPasswordEncoder montre cet avertissement lorsqu'il ne parvient pas à correspondre à un mot de passe brut avec un système de mot de passe.
Le hachage de mot de passe peut-être “$2b” ou “$2y” maintenant.
Et il y a un bug au Printemps de Sécurité qui a une regex toujours à la recherche de “$2a”. Mettre un point de débogage à la
matches()
fonction dans leBCryptPasswordEncoder.class
.Pouvez-vous vérifier votre clé secrète client est codé?
Quand oauth2 dependecncies déplacé vers le cloud, je commence à faire face à ce problème. Auparavant, il faisait partie du cadre de sécurité :
Maintenant, il fait partie de cloud cadre :
Donc, si vous utilisez le cloud de dépendance (à Finchley.La LIBÉRATION), alors vous pouvez avoir besoin d'encoder le secret comme ci-dessous :
La PasswordEncoder doit être définie comme ceci:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
Veuillez vérifier si votre méthode
UserDetails loadUserByUsername(String username)
retourne valideUserDetail
objet. En cas de renvoi de l'objet est null /objet avec des valeurs non valides alors vous aussi, vous allez voir cette erreur.BCryptPasswordEncoder de ne pas supprimer l' {bcrypt} id, mais DelegatingPasswordEncoder le faire. Quand j'définir explicitement BCryptPasswordEncoder comme un codeur pour DaoAuthenticationProvider il appelle les matches de la méthode sur BCryptPasswordEncoder (sans id de console), mais pas sur DelegatingPasswordEncoder (avec l'id de console).
À compter d'aujourd'hui, avec le Printemps de Démarrage 2.1.7.La publication, je suis toujours confronté à ce problème.
J'ai été en utilisant certains outils en ligne qui m'a donné des hachages en commençant par $2b $ou 2y,
ce qui Ressort de l'
BCryptPasswordEncoder
ne permet pas:Solution: utilisation
BCryptPasswordEncoder
classe pour encoder le mot de passe:Et puis:
Vous perdez probablement ce bean dans votre configuration de Sécurité
SecurityConfig
UserDetaulsService
et laPasswordEncoder
sont déjà définies auprotected void configure(AuthenticationManagerBuilder authenticationManagerBuilder)
. N'est-ce pas assez?J'ai eu le même message d'erreur et c'est à cause du type de données de la colonne mot de passe,
cette colonne a été longueur de la vierge fixe (CARACTÈRE), alors assurez-vous que Vous utilisez un type de données VARCHAR ou d'autre changement de la longueur de 60 pour vous le mot de passe de la colonne.
La meilleure façon d'identifier ce problème "Codé mot de passe ne ressemble pas à BCrypt" est l'installation d'une pause porint dans la classe org.springframework.de sécurité.crypto.bcrypt.BCryptPasswordEncoder. Et ensuite, vérifiez la cause de la warnning.
utilisation noop dans le secret, pour les tests.