小编Far*_*had的帖子

Rails:BCrypt::Errors::InvalidHash(无效哈希)Devise 1.5.4 Rails 2.2.5

我们在 devise.rb 中使用以下内容

config.encryptor = :bcrypt
Run Code Online (Sandbox Code Playgroud)

我们想将其更改为

config.encryptor = :authlogic_sha512
Run Code Online (Sandbox Code Playgroud)

还编写了代码来解密旧密码并在登录时将其哈希为新密码(在会话控制器内)

但是,更新密码后,注销并登录时出现错误

BCrypt::Errors::InvalidHash (invalid hash):
Run Code Online (Sandbox Code Playgroud)

如果我注释掉错误的原始点,此错误会随机出现。所以我认为设备配置或 user.rb 模型有问题。

用户模型有以下行:

devise :database_authenticatable, :registerable, :confirmable,
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:auth0, :google_oauth2]
Run Code Online (Sandbox Code Playgroud)

所以步骤顺序是这样的:

  1. 用户的信息位于数据库(现有用户)中。使用 bcrypt 加密的密码
  2. 用户登录并在会话控制器中,我们将密码重新哈希为 sha512 并将其存储在 crypto_password 字段中
  3. 用户退出
  4. 用户登录 *** 由于“invalid_hash”错误而无法登录。

知道这里可能有什么问题吗?提前致谢。

编辑:根据要求执行上述步骤 2 的代码:

class Users::SessionsController < Devise::SessionsController
...
...
email = params[:user]['login']

@user = User.find_by_email(email)
return if @user.nil?
# Get old password and salt
bcrypt = BCrypt::Password.new(@user.encrypted_password)
salt = bcrypt.salt

pwd = params[:user]['password']

pass …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails devise ruby-on-rails-3

3
推荐指数
1
解决办法
5131
查看次数

MyBatis 抛出异常“流已关闭”

我有一个作为 cron 运行的 java 应用程序。它使用MyBatis。在我的 mybatis-config.xml 中,我有

<environments default="staging">
        <environment id="prod_read">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.10.2:3306/myDB"/>
                <property name="username" value="dbuser"/>
                <property name="password" value="dbpass"/>
            </dataSource>
        </environment>
        <environment id="prod_write">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.10.1:3306/myDB"/>
                <property name="username" value="dbuser"/>
                <property name="password" value="dbpass"/>
            </dataSource>
        </environment>
        <environment id="staging">.....
</environments>
Run Code Online (Sandbox Code Playgroud)

因此,我在生产中使用 2 个 DB - 一个用于读从属,一个用于写主。

代码中,SqlSessionFactory的初始化是这样的

InputStream rd = this.getClass().getClassLoader()
            .getResourceAsStream(mybatisConfigXml);

try {
    sessionFactory_read = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_read");
    sessionFactory_write = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_write"); …
Run Code Online (Sandbox Code Playgroud)

java mybatis

2
推荐指数
1
解决办法
1506
查看次数

当多个线程访问静态对象时,在非静态方法中使用静态对象是否安全?

我的班级看起来像这样:

public Class A {

     private static final ObjectMapper mapper = new ObjectMapper();

     public String get(String key) {
          JsonNode nod = mapper.readTree(getFromCache(key));
     }
}
Run Code Online (Sandbox Code Playgroud)

多个线程将访问此方法.我需要同步它吗?我是否需要在方法中移动映射器?

java static multithreading non-static

1
推荐指数
1
解决办法
102
查看次数