我在POST请求中将用户对象绑定到Spring控制器。在该对象中,有一个密码字段。我不想检查该文件的BCrypt是否已编码,因为保存和更新这两个事件都映射到同一控制器。知道这怎么可能吗?
代码段:
screw.ingredients.all()
>>> <QuerySet [<Product: iron_rod>]>
screw.ingredients.all()[0].amount
>>> Traceback (most recent call last):
>>> File "<input>", line 1, in <module>
>>> AttributeError: 'Product' object has no attribute 'amount'
答案 0 :(得分:1)
很难做到。我过去解决此问题的方法是为changePassword
场景提供一种非常特定的方法。一旦在特定的代码段中解决了该问题,就永远不会使用常规保存来更新密码。
答案 1 :(得分:0)
不太清楚您要问什么,但是您可以相对容易地检查字符串是否“看起来像” bcrypt密码,因为它们具有独特的格式(例如$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i
)。
因此,如果您的字符串以$2
开头,后跟a
或b
(通常可以忽略其他情况),则另外一个$
是两位数的成本参数而另外一个$
则可能是bcrypt哈希。当然,bcrypt散列在许多系统上也将是有效的纯文本密码,但这是一个不太可能的选择(您总是可以拒绝这种格式的密码)。
从您的问题中也不清楚此值是否总是来自客户端-尽管客户端不应将bcrypt哈希发布到服务器。
答案 2 :(得分:0)
根据Spring的BCryptPasswordEncoder类,您可以检查是否使用此正则表达式模式对字符串进行了编码
Pattern BCRYPT_PATTERN = Pattern.compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");
if (BCRYPT_PATTERN.matcher(stringToCheck).matches()) {
// stringToCheck is an encoded bcrypt password.
}