用户名和密码的数据库验证不起作用。

时间:2013-02-12 08:44:20

标签: coldfusion coldfusion-9

我正在尝试登录部分,但它没有使用数据库验证用户名和密码。 谁能告诉我这段代码有什么问题?

服务/ User.cfc

  <cffunction name="login" access="public" output="false" returntype="any">
               <cfargument name="username" required="true">
               <cfargument name="password" required="true">
                    <cfquery name="getUser">
                             SELECT users.Id,
                                    users.username,
                                    users.password       
                             FROM  Users
                             Where UserName = <cfqueryparam value="#arguments.username#" cfsqltype="CF_SQL_VARCHAR">
                             AND   Password = <cfqueryparam value="#arguments.password#" cfsqltype="CF_SQL_VARCHAR">
                    </cfquery>
                    <cfif getUser.recordcount gt 0>
                       <cfreturn getUser>
                    </cfif>
      </cffunction>

控制器/ login.cfc

<cffunction name="login" access="public" returntype="void">
                          <cfargument name="rc" type="struct" required="true">
                          <cfset user = getUserService().login(arguments.rc.Username,arguments.rc.password)>
                               <cfif arguments.rc.username EQ UserName and arguments.rc.password EQ password>
                                     <cfset session.auth = structNew()>
                                     <cfset session.auth.isLoggedin = "yes"/>
                                     <!--- <cfset session.auth.id = users.id />  --->
                                     <cfset session.auth.username = UserName />
                                     <cfset session.auth.password = password />
                               <cfelse>
                                     <cfset rc.message = createMessage('error','','entered password is wrong')>
                                     <cfset variables.fw.redirect('login.default','message')>
                               </cfif>

             </cffunction>

感谢。

1 个答案:

答案 0 :(得分:3)

您检查调用login()的结果时,您没有确定用户名和密码的范围。尝试user.UserName和user.Password:

<cfif arguments.rc.username EQ user.UserName and arguments.rc.password EQ user.password>

您还需要检查login()的响应是否完全是查询。目前,如果用户名/密码不匹配,login()不返回任何内容。您可以在结果上使用IsQuery()或更改login()以始终返回结果集并只检查代码中的长度。如果用户名和密码不匹配,您还可以查看异常。然后,您可以尝试login()调用并在控制器的login()方法中捕获并处理失败。

您可能需要考虑将服务中的登录方法重命名为validateUserCredentials或类似的东西,因为您的控制器中会发生真正的登录(设置会话状态),尽管这仅仅是个人品味。

虽然不是问题的一部分(并且可能在您的代码中的其他位置找到),但您应该查看hashing and salting your passwords以保护您的用户