我正在尝试登录部分,但它没有使用数据库验证用户名和密码。 谁能告诉我这段代码有什么问题?
服务/ 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>
感谢。
答案 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以保护您的用户