הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   מערכת הרשאות מעניינת שחשבתי עליה (https://hosts.co.il/forums/showthread.php?t=34773)

iliakap2002 16-11-06 21:19

מערכת הרשאות מעניינת שחשבתי עליה
 
טוב אז זו מערכת הרשאות מעניינת לדעתי שעלה לי הרעיון שלה מ FSO ב ASP, מערכת ההרשאות לקבצים.

שימו לב לטבלה בעמוד שם ומה שכתוב מתחת:
http://www.webmaster.org.il/guide.as...fso&class=file

מה שמעניין שהחיבור של מספרים שונים בחיים לא יניב תוצאה שווה, מה שמאפשר לנו לחבר ושהמחשב יידע מה ההרשאות שניתנו.
עכשיו אני חשבתי, למה לא לקחת את המערכת הזאת ובמקום זה, לעשות את אותה המערכת למנהלים באתר מסויים, לכל אחד הרשאה משלו.

אז נגיד:
נגיד:
1= מסוגל לערוך הודעות
2= מסוגל לכתוב הודעות נעוצות
4= מסוגל למחוק הודעות
8= מסוגל להשעות משתמשים
16= מסוגל להוציא משתמשים להורג

עכשיו נגיד ה מנהל יכול 1+2+8=11 זאת אומרת, שלמנהל יש הרשאות, לעריכת הודעות, לכתיבת הודעות ולהשעיית משתמשים.

עכשיו אנחנו צריכים משהו שייקרא את זה, אני כמה ימים חשבתי על כל מיני דברים מסובכים, עד שאתמול הבנתי עד כמה זה פשוט וקליל.

פשוט מאוד ניקח שוב את ההרשאה 11, נתחיל מההרשאה בעלת המספר הגבוה ביותר וכך נרד לראשונה בצורה כזאת:
בודקים אם ההרשאה שניתנה גדולה מההרשאה שאנחנו בודקים, אם כן אז ההרשאה נכונה, מפחיתים את התוצאה עכשיו וממשיכים הלאה, אם לא, פשוט ממשיכים הלאה.

זאת אומרת:
נבדוק, האם 11 > 16 כמובן שלא, לכן נמשיך הלאה,
11>8
כן, נדע שהמנהל מסוגל להשעות משתמשים, עכשיו נפחית מ 11 8, נשאר 3

נבדוק עם 4, נקבל שלילי.

נבדוק עם 2
יש, נדע שהמנהל מסוגל לנעוץ הודעות, נפחית 2 מ 3, נשאר לנו 1.

נבדוק עם 1, נקבל חיובי.
נדע שהוא מסוגל לערוך הודעות נפחית שוב כי אנחנו בלולאה.

כמובן שיבואו כל מיני בדיקות ואם לא יישאר לנו 0 בסוף ההרשאה לא יכולה ליהיות קיימת
אם בהתחלה ההרשאה היא 0, זה אומר שאין לו בכלל הרשאות וכל מיני כאלו.

תוכנית קטנה שבניתי ב C ברבע שעה, הדגמה לקריאת הרשאות:

קוד:

#include<stdio.h>
#include<conio.h>
/*
premissions:
0=1
1=2
2=4
3=8
4=16
5=32
6=64
7=128
*/
void main()
{
 int i, userprem, prems[8], boolprems[8];
 clrscr();
 prems[0] = 1;
 userprem = 1 + 4 + 128 + 64;
 for(i=1; i<8; i++)
 {
  prems[i]=prems[i-1]*2;
  printf("%d, ", prems[i-1]);
 }
 printf("%d\n", prems[7]);
    /*
 for(i=0; i<8; i++)
 {
  boolprems[i] = 0;
  printf("%d, ", boolprems[i]);
 }
    */
 printf("\n");
 for(i=7; i>=0; i--)
 {
  if(userprem >= prems[i])
  {
        // printf("%d\n", userprem);
  boolprems[i] = 1;
  userprem = userprem - prems[i];
  printf("\n%d\n", userprem);
  }
 }
 for(i=0; i<8; i++)
 {
  if(boolprems[i] == 1)
  {
  printf("%d, ", prems[i]);
  }
        }
 getch();
}

אל תשימו לב לבלאגן בקו, רבע שעה.
זהו, אם יש לי טעויות אתם מוזמנים לתקן אוחתי באלגוריתם, תודה, כל הבדיקות שם לא עשיתי אבל זסה עניין שולי.
סתם רצילי לשתף.

ערב טוב לכולם, איליה.

RS324 17-11-06 12:34

זה אותו רעיון של לעשות הרשאות לפי ביטים לוגים...אני משתמש בזה שנים...אם תרצה אני אסביר לך..

tnadav 17-11-06 12:56

ציטוט:

נכתב במקור על ידי RS324
זה אותו רעיון של לעשות הרשאות לפי ביטים לוגים...אני משתמש בזה שנים...אם תרצה אני אסביר לך..

בבקשה, תסביר, אשמח לשמוע :-)

RS324 17-11-06 19:47

טוב אז ככה :

ביטים לוגים זה אומר 2 מצבים בלבד (אם למדת אלקטרוניקה פעם)

פועל - דלוק - 1
לא פועל - מכובה 0.

עכשיו אנחנו מגדירים את הפעולות שאנחנו רוצים שיווצרו
שים לב שכל אחד חייב להיות פי 2 מהקודם לו
PHP קוד:

$bits = array();

$bits['generalpermissions'] = array(
'canview' =>1,
'canpost' =>2,
'canread' =>4,
'canadd' =>8,
'canfuck' =>16,
); 

עכשיו תבנה פונקציה שמחברת את המספרים לדוגמא
10101
יהיה במקרה שלנו 21 ואז ב USERPOWER יהיה לנו 21...
זה קצת יותר ארוך פשוט אין לי ממש כוח לעשות הסבר מפורט לזה....

iliakap2002 17-11-06 21:04

אז מה זה שונה ממה שאני עשיתי?

RS324 17-11-06 21:46

ציטוט:

נכתב במקור על ידי iliakap2002
אז מה זה שונה ממה שאני עשיתי?

האמת לא קראתי כל כך את מה שאתה עשית...
ואם הייתי מסביר עד הסוף היית רואה שיש שוני
(אני לא מבין למה אתה צריך להשתמש בלולאות ??)

הרעיון בגדול הוא דומה...

Itay 18-11-06 00:18

חח מה קרה RS324, שכחת שכבר רשמת על זה מדריך? http://www.hosts.co.il/forums/showthread.php?t=32405

רק לא הבנתי למה פה אמרת שהמזהה צריך להיות גדול פי 2 מהמזהה הקודם.. שיהיה

RS324 18-11-06 03:51

ציטוט:

נכתב במקור על ידי Itay
חח מה קרה RS324, שכחת שכבר רשמת על זה מדריך? http://www.hosts.co.il/forums/showthread.php?t=32405

רק לא הבנתי למה פה אמרת שהמזהה צריך להיות גדול פי 2 מהמזהה הקודם.. שיהיה

כי המדריך שרשמתי פה
הוא לא משתמש בביטים לוגים :)

iliakap2002 18-11-06 09:08

האמת היא בכלל לא צריך לולאה, סתם עשיתי אותה כדי שתוכל לשנות לכמה הרשאות שאתה רוצה בלי שינויים משמעותיים בקוד...

SDF 18-11-06 15:59

יותר פשוט, bitwise operators.
 
יותר פשוט עם bitwise opertors
הנה דוגמא:

PHP קוד:

<?php
define 
('read'1);
define ('write'2);
define ('kick'4);
define ('ban'8);

function 
setflag (&$var$flag$set true)
{
 
// OR - settings flag
 // AND NOT - unsetting flag
   
$var $set ? ($var $flag) : ($var & ~$flag);
}


function 
isflagset (&$var$flag)
 {
   
$isflagset $var $flag;
 }


// init, read and write are on!
$myflags = (read write);

setflag($myflagsreadfalse); // unset read.
setflag($myflagskicktrue); //set kick.

isflagset($myflagsban); // return false.
isflagset($myflagskick); // return true.



?>



כל הזמנים הם GMT +2. הזמן כעת הוא 10:10.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ