2017-08-10 257 views
1

我正在构建一个闪亮的登录页面,其中用户输入用户名和密码并点击登录。R中的用户名和密码验证Shiny app

我有一个数据帧,其中用户名和相应的密码分别存储在usernamepassword列下的登录凭据组。

下面是我在server.r

reactive({validate(
    need(input$Username == df$username, message = FALSE), 
    need(input$Password == df$password, message = FALSE) 
     )}) 

脚本现在的问题是,我不能够与其对应的password验证username,用任何密码的用户名可以登录。请帮助你的逻辑。

df

username password 
     admin admin 
     jhon jhon 
     test test 
     ipt ipt 
     rock rock 
+0

存储这样的密码是非常糟糕的做法。最好使用openssl软件包比较哈希和腌制密码。 –

+0

@JoshGilfillan哦好吧,感谢您的建议,但我该如何实现? – SBS

+1

使用openssl包中的sha512()函数来存储粗体密码而不是普通密码。然后,当用户输入凭证时,将输入密码的散列值与存储密码的散列值进行比较。 sha512()函数还有一个防止字典攻击的关键参数。 –

回答

1

您可以同时需要用户名和密码通过连接他们和比较匹配。结果字符串。我也有密码散列在这里。

tbl <- read.table(text ="username password 
         admin admin 
         jhon jhon 
         test test 
         ipt ipt 
         rock rock", 
        header= TRUE, 
        stringsAsFactors = FALSE) 

library(openssl) 

tbl$password <- sha512(tbl$password) 

auths <- apply(tbl, 1, paste, collapse = "_") 

reactive({validate(
    need(paste0(input$Username,"_", sha512(input$Password)) == auths, message = FALSE) 
)}) 
+0

@Eumendies,谢谢你的代码。但代码似乎不起作用。现在验证功能似乎没有工作。用户可以登录,但没有输入用户名和密码。 – SBS

+0

我很抱歉听到这个消息。当没有提供用户名和密码时,请提供'paste0(输入$用户名,“_”,sha512(输入$密码))'的输出? – Eumenedies

+0

它表示'找不到对象输入'。 – SBS