Использовать структуру для добавления переменных в информацию для входа? - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь использовать структуру для организации трех наборов логинов и паролей. В идеале я хотел бы, чтобы form.password и form.username проверяли переменные структур userOne через userThree, а не только проверяли один экземпляр пароля и имени пользователя.

Может ли кто-нибудь указать мне направление того, что мне нужно знать / смотреть, чтобы это произошло?

Заранее спасибо.

<cfset userOne = structNew()>
<cfset userOne.name = "cat">
<cfset userOne.password = "meow">
<cfset userOne.group = "1">

<cfset userTwo = structNew()>
<cfset userTwo.name = "bird">
<cfset userTwo.password = "chirp">
<cfset userTwo.group = "2">

<cfset userThree = structNew()>
<cfset userThree.name = "mouse">
<cfset userThree.password = "squeak">
<cfset userThree.group = "3">

 <cfset this_password = "squeak">
   <cfif form.password neq "squeak" or form.username neq "mouse">
    <cflocation url="login.cfm?status=le">
         <cfelse>
       <cflock scope="session" timeout="10">
         <cfset session.valid_user = "yes">
       </cflock>
    <cflocation url="index.cfm" addtoken="no">
 </cfif>

Ответы [ 3 ]

0 голосов
/ 27 января 2012

Если вы можете вложить свои 3 пользовательские структуры в пользовательскую структуру с ключом по имени, вы можете выполнить structKeyExists(), чтобы найти подходящего пользователя, а затем просто проверить пароль.Кучи быстрее, чем циклы по многим структурам, одна за другой.

например.

<cfscript>
users = {
    cat = { name: "cat", password: "meow", group: 1 },
    bird = { name: "bird", password: "chirp", group: 2 },
    mouse = { name: "mouse", password: "squeak", group: 3 }
};

if (
    structKeyExists( form, 'username' )
    && structKeyExists( form, 'password' )
    && len( form.username & form.password ) > 0
    && structKeyExists( users, form.username )
    && structKeyExists( users[form.username], 'password' )
    && users[form.username].password == form.password
) {
    // sign them in
}
else {
    // throw error "invalid username or password"
}
</cfscript>
0 голосов
/ 27 января 2012

Вот еще один способ справиться с этим:

<cfscript>
users = [{
    username = "cat",
    password = "meow"
},{
    username = "bird",
    password = "chirp"
},{
    username = "mouse",
    password = "squeak"
}];

for (user in users) {
    if (user.username == form.username && user.password == form.password) {
        // handle success log in
        // redirect
    }
}

// handle invalid log in
// redirect
</cfscript>
0 голосов
/ 27 января 2012
<cfset userOne = structNew()>
<cfset userOne.name = "cat">
<cfset userOne.password = "meow">
<cfset userOne.group = "1">

<cfset userTwo = structNew()>
<cfset userTwo.name = "bird">
<cfset userTwo.password = "chirp">
<cfset userTwo.group = "2">

<cfset userThree = structNew()>
<cfset userThree.name = "mouse">
<cfset userThree.password = "squeak">
<cfset userThree.group = "3">

 <cfset this_password = "squeak">
   <cfif NOT (authUser(userOne, form.username, form.password)
        OR authUser(userTwo, form.username, form.password)
        OR authUser(userThree, form.username, form.password))>
    <cflocation url="login.cfm?status=le">
         <cfelse>
       <cflock scope="session" timeout="10">
         <cfset session.valid_user = "yes">
       </cflock>
    <cflocation url="index.cfm" addtoken="no">
 </cfif>


<cffunction name="authUser" access="public" output="false" returntype="boolean">
    <cfargument name="user"        type="struct" required="true">
    <cfargument name="username" type="string" required="true">
    <cfargument name="password" type="string" required="true">
    <cfreturn (arguments.user.name EQ arguments.username) AND (arguments.user.password EQ arguments.password)>
</cffunction>

Это будет работать, но это немного грязно. Я надеюсь, что это просто пример вашей проблемы, а не как она работает.

...