2014-10-10 54 views
0

这个代码不工作:如何使用pgcrypto在Postgres的登录9

select * 
     from persons 
     where lower(email) = lower({email}) 
     and (password = crypt('{password}', password)) 
     and approved = 1 
     and now() between start_date and coalesce(end_date, current_timestamp); 

代码我必须设置散正常工作:

Insert into persons (
      person_id 
,  name_first 
,  name_last 
,  email 
,  phone 
,  username 
,  password 
,  start_date 
,  approved 
,  superuser) 
     values 
     (
     nextval('PERSON_ID_SEQ') 
,  {name_first} 
,  {name_last} 
,  {email} 
,  {phone} 
,  'username' 
,  crypt('{password}', gen_salt('md5')) 
,  now() 
,  0 
,  0 
     ) 

,但我似乎无法得到该位右对照输入的密码来检查散列。 我想在where子句中进行检查,以便在匹配时可以返回人员行。

在此先感谢 马丁

+1

为什么{}密码在引号,但{}电子邮件是不是?从地址条款中抽出隐藏调用并将其放入选择列表中,以便您可以看到实际发生的情况。 – jjanes 2014-10-10 19:13:45

+0

您是否检查过您的选择是否没有其他限制(如startdate,approved,...)? – 2014-10-10 19:15:57

+0

'password'列的数据类型是什么?请注意,'pwhash'会是一个更好的列名! – Andomar 2014-10-10 20:47:24

回答

0

减少的问题分成更小的叮咬......看什么 选择的crypt(“{}密码”,“你好”) 让你,是否在该表的匹配任何东西。

此外,日期比较看起来不是一个非常好的想法,因为它假定对两个不同的时变表达式进行瞬时/原子评估。

明确lowercasing的电子邮件是有点傻,除非出于某种原因该列使用区分大小写排序...