-1

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

服务/用户.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>

谢谢。

4

1 回答 1

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 或类似的东西,因为真正的登录(设置会话状态)发生在您的控制器中,尽管这只是个人喜好问题。

Although not part of the question (and possibly addressed elsewhere in your code), you should look at hashing and salting your passwords in order to protect your users

于 2013-02-12T09:06:46.783 回答