当前位置: 首页 > 知识库问答 >
问题:

Spring Security(3.2)BCrypt没有对登录时的密码进行哈希处理

罗浩然
2023-03-14

我试图用MySQL中的一个数据库在Spring Web应用程序登录中训练哈希,但当我引入正确的密码时,登录名总是用?error=true再次发送我到登录名。

我确定,如果我把我在表'users'中的密码(即散列密码)准确地放入,我就可以正确地访问主页。由于项目的规范,所有的配置都是在XML文件中进行的。我是Spring的新手,我无法确定上下文文件中的错误在哪里。我使用两个身份验证提供者,但我只需要在其中一个中使用BCrypt enconder。

    null
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<!--    Rutas que se ignoraran  -->
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/assets/**" security="none"/>
<security:http pattern="/img/**" security="none"/>
<security:http pattern="/js/**" security="none"/>
<security:http pattern="/login*" security="none"/>
<security:http pattern="/recovery/*" security="none"/>
<security:http pattern="/recovery/initRecovery/*" security="none"/>

<security:http pattern="/lock*" use-expressions="true" auto-config="true">
     <security:intercept-url pattern="/lock*" access="permitAll" />
</security:http>


<security:http  
    auto-config="true" use-expressions="true"  
    authentication-manager-ref="authenticationManager" 
    access-denied-page="/denegado" >
    <security:intercept-url pattern="/**" access="isAuthenticated()" />
    <security:form-login login-page="/login" default-target-url="/init" authentication-failure-url="/loginfailed" />
    <security:logout invalidate-session="true" logout-success-url="/" />
</security:http>

<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
    <constructor-arg name="strength" value="10" />
</bean>

<bean id="authenticationProviderCrece" 
      class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="userDetailsServicecrece"/>
</bean>


<bean id="authenticationProviderSac" 
      class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="userDetailsServicesac"/>
</bean>


<bean id="authenticationManager"
    class="org.springframework.security.authentication.ProviderManager">
  <property name="providers">
    <list>
      <ref local="authenticationProviderCrece"/>
      <ref local="authenticationProviderSac"/>
    </list>
  </property>
</bean>

<security:authentication-manager>
    <security:authentication-provider user-service-ref="userDetailsServicecrece"/>
    <security:authentication-provider user-service-ref="userDetailsServicesac">
        <security:password-encoder ref="encoder"/>
    </security:authentication-provider>
</security:authentication-manager>

usuariosDetailsServiceImpl.java

package com.segurosargos.sac.service.impl;

import java.util.ArrayList;
import java.util.Collection;

import javax.annotation.Resource;

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 com.segurosargos.sac.modelo.entidad.Usuario;
import com.segurosargos.sac.service.UsuarioService;

@Service("userDetailsServicesac")
public class UsuariosDetailsServiceImpl implements UserDetailsService {

@Resource
private UsuarioService usuarioService;

   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
       System.out.println("Buscando usuario en BD SAC...");

       Usuario usuario = usuarioService.findByUsername(username);

       if (usuario != null) {

           boolean enabled = usuario.isEnabled();
           boolean accountNonExpired = usuario.isAccountNonExpired();
           boolean credentialsNonExpired = usuario.isCredentialsNonExpired();
           boolean accountNonLocked = usuario.isAccountNonLocked();

           Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
           authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

           User user = new User(usuario.getUsername(), usuario.getPassword(),
                enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);

           return user;
       }

       return null;

    }
}

共有1个答案

游鸣
2023-03-14

谢谢大家的回复。我只需修改SecurityContext.xml,直接在DaoAuthenticationProvider中更改PasswordEnconder的注入。passwordEncoder是添加类BCryptPasswordEncoder的bean的id。

    <bean id="authenticationProviderSac" 
      class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="userDetailsServicesac"/>
    <property name="passwordEncoder" ref="passwordEncoder" />
</bean>


<bean id="authenticationManager"
    class="org.springframework.security.authentication.ProviderManager">
  <property name="providers">
    <list>
      <ref local="authenticationProviderCrece"/>
      <ref local="authenticationProviderSac"/>
    </list>
  </property>
</bean>

<security:authentication-manager>
    <security:authentication-provider user-service-ref="userDetailsServicecrece"/>
    <security:authentication-provider user-service-ref="userDetailsServicesac" />
</security:authentication-manager>
 类似资料:
  • 问题内容: 我时不时听到“使用bcrypt在PHP中使用密码,bcrypt规则存储密码”的建议。 但是什么呢?PHP不提供任何此类功能,维基百科对文件加密实用程序不屑一顾,而Web搜索仅显示了几种以不同语言实现的Blowfish实现。现在Blowfish也可以通过PHP在PHP中使用,但这对存储密码有何帮助?河豚是一种通用密码,它有两种工作方式。如果可以加密,则可以解密。密码需要单向散列功能。 有

  • 问题内容: 以下问题比最初看起来要复杂。 假设我有一个任意的JSON对象,其中可能包含任意数量的数据,包括其他嵌套的JSON对象。我想要的是JSON数据的加密哈希/摘要,而不考虑实际的JSON格式本身(例如:忽略换行符和JSON令牌之间的间距差异)。 最后一部分是要求,因为JSON将由许多不同平台上的各种(反)序列化器生成/读取。我知道至少有一个Java JSON库,该库在反序列化期间读取数据时会

  • 我记得读过一个方案,其中检查密码的过程是这样的: 给定数据库中的(哈希、盐)值, 用salt哈希密码以检查哈希, 使用旧哈希作为salt的哈希密码, 在数据库中存储(新哈希,也称为旧哈希) 我找不到原始来源无论如何,我不明白 > < li> 使用旧哈希作为salt的优势是什么(与使用随机salt相反), 这种方案的优点是什么(进一步使彩虹表攻击复杂化?),以及 如果有优势,如何使用PHPass应用

  • 问题内容: 我想用散列密码,以后再验证提供的密码是否正确。 散列密码很容易: 如何将纯文本密码与存储的哈希值进行比较? 问题答案: 使用py-bcrypt,您不需要单独存储盐:将盐存储在哈希中。 您可以简单地将哈希用作盐,盐将存储在哈希的开头。

  • 问题内容: 我使用Node.js + passport设置了一个用于用户身份验证的站点。 现在,我需要迁移到Golang,并需要使用保存在db中的用户密码进行身份验证。 Node.js加密代码为: 如何使用Golang制作与Node.js bcrypt相同的哈希字符串? 问题答案: 我相信使用golang.org/x/crypto/bcrypt软件包将是: 工作示例:

  • 我已经对我的注册脚本中的密码进行了加密,它们存储在数据库中,我必须使用它们登录,所以我想使用未加密的密码登录。我已经阅读了这里的一些帖子,但没有任何帮助。我如何才能将其添加到我的登录中。php?盐也存储在数据库中。 这是我的登记簿。用于加密的php脚本 这是我的季节login.php