-1

ログインセクションを実行しようとしていますが、データベースでユーザー名とパスワードが検証されません。このコードの何が問題なのか誰か教えてもらえますか?

サービス/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>

ありがとう。

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などに変更することを検討してください。ただし、これは個人的な好みの問題です。

質問の一部ではありませんが(そしておそらくコードの他の場所で対処されています)、ユーザーを保護するためにパスワードのハッシュとソルトを検討する必要があります

于 2013-02-12T09:06:46.783 に答える