2

cf で複数のログインを防止する最も簡単な方法は何ですか?

<cfcomponent>
<cfset This.name = "Name">

<cfset This.Sessionmanagement="True">
<cfset This.loginstorage="session">
<cfset This.sessionTimeout = "#CreateTimeSpan(0, 0, 50, 0)#"> 
<cfset This.applicationtimeout="#createtimespan(0,0,50,0)#">
<cfset This.scriptProtect = "All">

<cffunction name="OnRequestStart">
    <cfargument name = "request" required="true"/>

    <cfif IsDefined("Form.logout")> 

        <cflogout>

        <cfset StructClear(Session)>

        <cflocation url="/" addtoken="no">

    </cfif>

    <cflogin>
        <cfif NOT IsDefined("cflogin")>
            <cfinclude template="loginform.cfm">
            <cfabort>


        <cfelse>
            <cfif cflogin.name IS "" OR cflogin.password IS "">
                <cfoutput>
                    You must enter text in both the User Name and Password fields.
                </cfoutput>
                <cfinclude template="loginform.cfm">
                <cfabort>
            <cfelse>
                <cfquery name="loginQuery" dataSource="datadsn">
                SELECT *
                FROM userlogin
                WHERE
                UserID = <cfqueryparam value="#cflogin.name#" cfsqltype="CF_SQL_VARCHAR"> 
                AND Password = <cfqueryparam value="#hash(cflogin.password)#" cfsqltype="CF_SQL_VARCHAR">
                AND trenabled = <cfqueryparam value="1" cfsqltype="CF_SQL_VARCHAR">
<!--- Project ID--->
                AND projectid = <cfqueryparam value="23" cfsqltype="CF_SQL_VARCHAR">
                </cfquery>

                <cfset loginpass = #hash(cflogin.password)#>

                <cfset comparison = Compare(loginQuery.Password, loginpass)>

                <cfif loginQuery.trRoles NEQ "" AND comparison EQ 0>

                <cfloginuser name="#cflogin.name#" Password = "#loginpass#" roles="#loginQuery.trRoles#">

                <cfelse>
                    <cfoutput>
                        Your login information is not valid.<br>
                        Please Try again.
                    </cfoutput>    
                    <cfinclude template="loginform.cfm">
                    <cfabort>
                </cfif>
            </cfif>    
        </cfif>
    </cflogin>

    <cfif GetAuthUser() NEQ "">
        <cfoutput>
             <form method="Post">
                <input type="submit" Name="Logout" value="Logout">
            </form>
        </cfoutput>

    </cfif>

</cffunction>

<cffunction name="onSessionEnd" returnType="void">


</cffunction>

</cfcomponent>
4

3 に答える 3

1

私が見つけた最も簡単な方法は、ColdFusion の基盤となる Java セッション スコープに結び付けて、お持ちの既存のログインを探すことです。

そこにある場合は、他のセッションをキックアウト/期限切れにして、現在のセッションを入れます。

これが私のコードの例です。セッションを強制終了/終了するにはさまざまな方法があり、それぞれに長所/短所があることに注意してください。この例は、継承されたコードベース用です。

getLogin.fld_userid は、試行されたログイン ID が html フォームからのものです。

セッション変数を初期化する前に、「ログイン時」にこのコードを実行します。

<!---code for 1user per login  --->  
<cfset liveSessions = createObject("java","coldfusion.runtime.SessionTracker")>
<cfset activesessions = liveSessions.getSessionCollection(YOUR_DATA_SOURCE_NAME)>

<cfloop item="loopSession" collection="#activesessions#">
  <cfscript>
    thisSession = activesessions[loopSession];

    if(StructIsEmpty(thisSession)) {
      // do nothing
    } else {
      if(isDefined("thisSession.loginUserid")) {
        thisUser = thisSession.loginuserid;
        if(thisSession.loginuserid EQ getlogin.fldUser_ID) {
          thisSession.XXAutoToken="";
          //structClear(thisSession);
          //cflocation(theUrl:"index.cfm?home.welcome");
          thisSession.setMaxInactiveInterval(1);
          break;
        }
      }
    }
  </cfscript>
</cfloop>
于 2010-11-03T15:58:07.343 に答える
1

私が働いている場所では、1 人のユーザーによる 1 つのアプリケーションへのログイン数を制限するという厳格な要件があります。私はこの問題に次のように取り組みました:

1)ユーザー情報を保持するユーザーログインテーブルと、「最終更新」および「ログイン」と呼ばれるフィールドがあります。ユーザーが現在の時刻の日付で「最終更新」をログインし、「ログイン」を 1 でログインすると、そのユーザーは再度ログインできなくなります。

2)jquery ajax呼び出しを作成して、データベースフィールド「最終更新」を新しい日時スタンプで更新します。これはスケジュールに従って発生します (1 分ごとなど)。

3) 最後に、ユーザーの「ログイン」ステータスが 1 から変更された場合、(データベース内の) アクティブなログインの最後の更新が一定期間を超えているかどうかを確認するタスクをスケジュールする必要がありました。 0 に変更します (再度ログインできるようにします)。これが重要な理由は、ユーザーが離れるときに常に「ログアウト」をクリックすると想定できないためです。ブラウザを閉じたり、移動したりするだけの場合もあります。これが発生すると、ユーザーがアプリケーションに戻ろうとすると、再度ログインできなくなります (データベースはユーザーが既にログインしていると見なすため)。

これが正しい方向に進むことを願っています。

于 2010-11-03T13:56:08.073 に答える