ãã®èšäºã§ã¯ã質åã«è§ŠããŸãã
1. ACLã®ã¢ã€ãã¢
2.ããŒã¿ããŒã¹èšèš
3.ããŒã¿ããŒã¹ã®æ£èŠå
4.ã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°
5.äœæ¥ã³ãŒãã®æé©å
ãã®èšäºã¯ãCMSã®ã¢ã¯ã»ã¹æš©ã®ãã€ããªé åžã«å¯Ÿããå¿çã§ãã èè ãå®çšçãªéšåãæžããŠããéãç§ã¯ããªãé·ãé䜿çšããŠããç§ã®ããŒãžã§ã³ãæäŸããããšæããŸãã
ãããã説æããå 容ã¯ã ACLã®ããã«èŠããŸãã
ã¢ã€ãã¢ã®ç°¡åãªèª¬æ
ã¢ã¯ã»ã¹æš©ã¯ãé©çšããå¿ èŠããããã¹ãŠã®ãªããžã§ã¯ãã«å±ããŸãã
ç°¡åãªãã¥ãŒã¹ããŒãžã®äŸïŒããã§èª¬æããŸãïŒãæ€èšããå Žåãã¢ã¯ã»ã¹æš©ã¯æ¬¡ã®ããã«ãªããŸãã
1ïŒã¡ã€ã³ãã¥ãŒã¹ããŒãž-ã°ããŒãã«ã¢ã¯ã»ã¹æš©ããæ°ãããã¥ãŒã¹ã®äœæãããäžçšåºŠã®ãã¥ãŒã¹ãããããŒãžèªäœã®è¡šç€ºããæå³ããŸãã
2ïŒåãã¥ãŒã¹-ããã¥ãŒã¹ã®èè ãç·šéããããŸãã¯ãã³ã¡ã³ããæ®ããªããæ©èœã
ã¢ã¯ã»ã¹æš©ã·ã¹ãã ã¯æ¬¡ã®ãã®ã§æ§æãããŸãã
{ã°ã«ãŒã} + {ã¢ã¯ã·ã§ã³}ãŸãã¯{ã°ã«ãŒã}-{ã¢ã¯ã·ã§ã³}
ã°ã«ãŒãã¯ã次ã®ååã®ã»ããã§ãã
1ïŒç¹å®ã®ãŠãŒã¶ãŒã®æš©å©ïŒããšãã°ããUser1ãããUser2ã...ïŒã ããšãã°ããã®ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ãããã©ã€ããŒãã¡ãã»ãŒãžãããµã€ãã§èªåã®ã¡ãã»ãŒãžã®ã¿ãç·šéã§ããããã«ããããã«äœ¿çšãããŸãã
2ïŒç¹å®ã®ã¢ã¯ã·ã§ã³ã«æš©éãä»äžããå¿ èŠããããã©ã€ããŒãããŒãžã®ã°ã«ãŒãïŒãŸãã¯ãŠãŒã¶ãŒã°ã«ãŒãïŒã ïŒäŸïŒç®¡çè ãã¹ãŒããŒã¢ãã¬ãŒã¿ãŒãªã©ïŒ
3ïŒè¿œå ã®ããããã£ã ïŒããšãã°ããã©ã°ã¯ã¢ãŒãåãæ¿ãã§ãïŒ
ã¢ã¯ã·ã§ã³ -æ¢åã®{Group}ãæã€ãŠãŒã¶ãŒãå®è¡ã§ããäžé£ã®ã¢ã¯ã·ã§ã³ã åœç€Ÿã®ãã¥ãŒã¹ã·ã¹ãã ã§ã¯ã次ã䜿çšã§ããŸãã
N-æ°ãããããã¯ãè¿œå
D-ãããã¯ãåé€
E-ãããã¯ãç·šé
V-ãããã¯ãåç §
C-ã³ã¡ã³ããæ®ã
B-ã³ã¡ã³ããåé€
±ãŠãŒã¶ãŒã«ãã®ãããªæš©å©ãäžããããã¢ã¯ã·ã§ã³ãžã®ã¢ã¯ã»ã¹ãïŒåªå ïŒäžããªãããšãæå³ããŸãã äŸïŒãŠãŒã¶ãŒ+ VCããŠãŒã¶ãŒ-C =ãŠãŒã¶ãŒ+Vã
次ã«ãç°¡åãªãã¥ãŒã¹ãµã€ãã®ã¢ã¯ã»ã¹æš©ã®äŸãèããŠã¿ãŸãããã
MainNewsPageãªããžã§ã¯ãïŒ
ãŠãŒã¶ãŒ+ VCãã¢ãã¬ãŒã¿ãŒ+ NEDBã管çè + NEDB
NewsMessageãªããžã§ã¯ãïŒ
User1 + EDïŒååãšããŠãã¢ãã¬ãŒã¿ãŒã®ã¿ãè¿œå ã§ããå Žåã¯äžèŠã§ãïŒ
Users-CïŒã³ã¡ã³ããæ®ããããªãå Žåã«äœ¿çšã§ããŸãïŒ
NewsCommentãªããžã§ã¯ãïŒ
User2 + BïŒããã§ã¯ããã¹ãŠã®ãŠãŒã¶ãŒãã³ã¡ã³ããæ®ãããšãã§ããŸããã誰ã§ãã³ã¡ã³ããåé€ã§ããããã§ã¯ãªããããå¿ èŠã§ãïŒ
ã³ã³ãã¥ãŒã¿ãŒã®ã¢ã€ãã¢ãç解ããããã®ã·ã¹ãã ãç°¡çŽ åãã
ãŸãããªããžã§ã¯ãã®æš©å©ãæ±ãããã®ããŒã¿ããŒã¹ãå®çŸ©ããŸãã
ããã€ãã®æš©å©ã®ãªã¹ããååŸããŠããããããã®ãããªããŒã¿ããŒã¹ããå§ããããšãã§ããŸãã
RightsID-æš©å©ã®ãªã¹ãã®èå¥åã
ã°ã«ãŒã - ã°ã«ãŒãã®ååã
ãµã€ã³ -ã°ã«ãŒããµã€ã³ã
ã¢ã¯ã·ã§ã³ - ã¢ã¯ã·ã§ã³ã®ååã
äŸ1ïŒMainNewsPageã®ã¢ã¯ã»ã¹èš±å¯ïŒïŒ
ID | ã©ã€ã·ãã | å£äœ | ãµã€ã³ | ã¢ã¯ã·ã§ã³ |
---|---|---|---|---|
1 | 100 | ãŠãŒã¶ãŒ | + | V |
2 | 100 | ãŠãŒã¶ãŒ | + | C |
3 | 100 | ã¢ãã¬ãŒã¿ãŒ | + | N |
4 | 100 | ã¢ãã¬ãŒã¿ãŒ | + | E |
5 | 100 | ã¢ãã¬ãŒã¿ãŒ | + | D |
6 | 100 | ã¢ãã¬ãŒã¿ãŒ | + | B |
7 | 100 | 管çè | + | N |
8 | 100 | 管çè | + | E |
9 | 100 | 管çè | + | D |
10 | 100 | 管çè | + | B |
äŸ2ïŒNewsMessageã«å¯Ÿããæš©å©ïŒïŒ
ID | ã©ã€ã·ãã | å£äœ | ãµã€ã³ | ã¢ã¯ã·ã§ã³ |
---|---|---|---|---|
11 | 101 | User1 | + | D |
12 | 101 | User1 | + | E |
13 | 101 | ãŠãŒã¶ãŒ | - | C |
SELECT * FROM `rights_action` WHERE` RightsID` = 100ãèŠæ±ãããšãå¿ èŠãªãªããžã§ã¯ãã«å±ãããã¹ãŠã®æš©éãååŸããŸãã
ããŒãã«ã®æ£èŠåã ãŠãŒã¶ãŒæš©éãè¿œå ããŸãã
ããŒãžã衚瀺ãããŠãŒã¶ãŒã¯ãææããæš©å©ãæã£ãŠããå¿ èŠããããŸãã ãããã«åºã¥ããŠããŠãŒã¶ãŒã«ã¢ã¯ã·ã§ã³ã®æš©å©ããããã©ãããç¥ãããšãã§ããŸãã
äŸïŒUser2ãUsersãModeratorã
ãããè¡ãã«ã¯ãæš©å©ããŒãã«ãå®çŸ©ããŸãã
RightsID-ãŠãŒã¶ãŒæš©å©ã®ãªã¹ãã®èå¥åã
ã°ã«ãŒã -ãŠãŒã¶ãŒãã¡ã³ããŒã«ãªã£ãŠããã°ã«ãŒãã®ååã
äŸïŒ
ID | ã©ã€ã·ãã | å£äœ |
---|---|---|
1 | 10 | User1 |
2 | 10 | ãŠãŒã¶ãŒ |
3 | 10 | ã¢ãã¬ãŒã¿ãŒ |
ãã®çµæãIDããŒãåé€ããã3ã€ã®ããŒãã«ãååŸãããŸãã
rights_action-ãªããžã§ã¯ãã®æš©å©
RightsIDïŒæŽæ°ïŒpkïŒ -æš©å©ãªã¹ãã®èå¥åã
GroupIDïŒæŽæ°ïŒpkïŒ -ã°ã«ãŒãã®ååã
ãµã€ã³ïŒtinyintïŒ1ïŒ -ã°ã«ãŒãã®ãµã€ã³ã
ã¢ã¯ã·ã§ã³ïŒåæïŒpkïŒ -ã¢ã¯ã·ã§ã³ã®ååã
rights_group-ãŠãŒã¶ãŒæš©é
RightsIDïŒæŽæ°ïŒpkïŒ -ãŠãŒã¶ãŒæš©å©ã®ãªã¹ãã®èå¥åã
GroupIDïŒæŽæ°ïŒpkïŒ -ãŠãŒã¶ãŒãã¡ã³ããŒã«ãªã£ãŠããã°ã«ãŒãã®èå¥åã
rights_names-ã°ã«ãŒãå
GroupIDïŒæŽæ°ïŒpkïŒ -ã°ã«ãŒãèå¥åã
name-ã°ã«ãŒãã®ååã
äž»ããŒãIDããä»ã®ããŒã«çœ®ãæããŸãããå Žåã«ãã£ãŠã¯ãããŒãã«å ã®ããã€ãã®ãã£ãŒã«ãã§æ§æãããŠããŸãã
ã°ã«ãŒãã®ç¬Šå·ã¯ã0ïŒ+ïŒãŸãã¯1ïŒ-ïŒã«ãªããŸãããããã«ãããã°ã«ãŒããžã®ã¢ã¯ã»ã¹ã容æã«ãªãããã§ãã
GroupIDèå¥åã¯ãrights_namesã®ååãçŽæ¥æããŸãã
å®éã rights_namesããŒãã«ã¯ãå¿ èŠãªã¢ã¯ã·ã§ã³ã«å¯Ÿããæš©å©ãèå¥ããããã«äœ¿çšãããªãä»é²ã§ãã ãã®ããŒãã«ã¯ãçµæãã人éåãããããã ãã«åœ¹ç«ã¡ãŸãã
ç§ãã¡ãåŸããã®ã®äŸïŒ
rights_name | |||
---|---|---|---|
Groupid | ãåå | ||
10 | ãŠãŒã¶ãŒ | ||
11 | ã¢ãã¬ãŒã¿ãŒ | ||
12 | 管çè | ||
1001 | User1 | ||
1002 | User2 | ||
1003 | User3 | ||
rights_group | |||
ã©ã€ã·ãã | Groupid | ||
1 | 1001 | ||
1 | 10 | ||
1 | 11 | ||
rights_action | |||
ã©ã€ã·ãã | Groupid | ãµã€ã³ | ã¢ã¯ã·ã§ã³ |
100 | 10 | 0 | message_view |
100 | 10 | 0 | comment_create |
100 | 11 | 0 | message_create |
100 | 11 | 0 | message_edit |
100 | 11 | 0 | message_delete |
100 | 11 | 0 | comment_delete |
100 | 12 | 0 | message_create |
100 | 12 | 0 | message_edit |
100 | 12 | 0 | message_delete |
100 | 12 | 0 | comment_delete |
101 | 1001 | 0 | message_edit |
101 | 1001 | 0 | message_delete |
101 | 10 | 1 | comment_create |
ããã§ãä»»æã®ã¢ã¯ã·ã§ã³ã®ããŒãã«å ã®ä»»æã®ãªããžã§ã¯ãã«æš©éãè¿œå ã§ããŸãã ã¢ã¯ã·ã§ã³ã¯ENUMïŒãã£ãŒã«ããã¢ã¯ã·ã§ã³ãïŒã®åœ¢åŒã§ããŒãã«ã«æžã蟌ãŸããããã«ãªããŸãããããã«ããããããžã§ã¯ãã®ç解ãšéçºã容æã«ãªããŸãã ã¢ã¯ã·ã§ã³èªäœã¯æååã®ãããªãã®ã§ã奜ããªããã«åŒã³åºãããšãã§ããŸãã
`rights_group`ã¯ãŠãŒã¶ãŒã«çµã³ä»ããããã¹ãã§ããããŠãŒã¶ãŒãææããæš©å©ã«ã€ããŠè©±ããŸãã
`rights_action`ã¯ãªããžã§ã¯ãã«ãã€ã³ããããŠãŒã¶ãŒãå®è¡ã§ããæš©éãã¢ã¯ã·ã§ã³ãæå®ããå¿ èŠããããŸãã
äŸïŒãã¥ãŒã¹ãµã€ãã®å ŽåïŒïŒ
news_pageïŒã¡ã€ã³ãã¥ãŒã¹ããŒãžã®ãã©ã¡ãŒã¿ãŒïŒ | ||||
---|---|---|---|---|
PageID | ã©ã€ã·ãã | ãåå | ||
1 | 100 | ãã¥ãŒã¹ããŒãž | ||
news_messageïŒãã¥ãŒã¹ããŒãžã«æçš¿ïŒ | ||||
Msgid | PageID | ã©ã€ã·ãã | ããã㌠| ã¡ãã»ãŒãž |
1 | 1 | 101 | ãã°ããç§ãã¡ã¯ã¡ã€ã³ã§ã!!! | ããããããã¯ã»ãã®å§ãŸãã«éããŸããããã®ãããHabrã®ç®¡çã«è¿ã¥ããš... |
2 | 1 | 101 | å é±ã®ãã¥ãŒã¹ | ã¡ã€ã³ã«æ²¿ã£ãŠæŽç¶ãšè¡é²ããŠããã«ãããããããèšç»ãéåããããã§ã... |
ã¢ã¯ã»ã¹æš©ã©ã€ãã©ãªã®éçº
ãããŠããããã®ããŒãã«ããŸãšããããã«å¿ èŠãªãã®ã確èªããå¿ èŠãªçµæãéžæããå¿ èŠããããŸãã
ã¢ã¯ã·ã§ã³ã®å¯èœæ§ããã§ãã¯ãããšãã®ã¢ã¯ã·ã§ã³ã®ã¢ã«ãŽãªãºã ïŒ
1ïŒããŒã¿ããŒã¹ãããå¿ èŠãªãªããžã§ã¯ãã®æš©å©ã®éžæãååŸããŸãã ïŒ100ïŒãŠãŒã¶ãŒ+ VCãã¢ãã¬ãŒã¿ãŒ+ NEDBã管çè + NEDBïŒ
2ïŒå¿ èŠãªã¢ã¯ã·ã§ã³ïŒã¢ã¯ã·ã§ã³ïŒãéžæããŸãã ïŒVïŒãŠãŒã¶ãŒ+ VïŒ
3ïŒãŠãŒã¶ãŒã®ã¢ã¯ã»ã¹æš©ãšéžæãããã®ãæ¯èŒããŸãã ïŒãŠãŒã¶ãŒããŠãŒã¶ãŒ1 <=>ãŠãŒã¶ãŒ+ïŒ
4ïŒçµæããªãå Žåã¯ãfalseãè¿ããŸãã
5ïŒçµæããã€ãã¹ã§æ§æãããŠããå Žåãfalseãè¿ããŸãã ãã以å€ã®å Žåã¯ãtrueãè¿ããŸãã
泚ç®ãã¹ããã1ã€ã®ãã€ã³ãã¯ã芪ïŒãã¥ãŒã¹ããŒãžïŒããåïŒãã®å Žåã¯ã¡ãã»ãŒãžïŒãžã®ã¢ã¯ã»ã¹èš±å¯ã§ãã ã€ãŸããããŒãž+ 'message_view'ã§æå®ãããšããã¹ãŠã®ã¡ãã»ãŒãžã¯èªåçã«ãã®ãããªæš©å©ïŒèªã¿åãïŒã«ãªããŸãã ã¢ã«ãŽãªãºã ã®ãã©ã°ã©ã1ã§ãã®ç¶æ³ã䜿çšããŠæ€èšŒããŸãã
å®è£ ã«ç§»ããŸãããïŒ
å®éãæ£ããéžæãããããã«PHPã¯å¿ èŠãããŸããã mysqlã§ãã¹ãŠãè¡ããŸãã
ã¢ã€ãã 1
ãã®å Žåãè€æ°ã®ãªããžã§ã¯ããããrightsIDãããŒã¿ãèªã¿åããããŒãã«ããããããéžæããå¿ èŠããããŸãã
ããŒãžã«å¯Ÿããæš©éãšããŒãžäžã®åã ã®æçš¿ã«å¯Ÿããæš©éããããããããã€ãã®ãªããžã§ã¯ãã äž¡æ¹ã®æš©å©ã¯äºãã«è£å®ããŸãã ïŒåããã£ã³ã°èŠªïŒ
ããšãã°ãããŒãžäžã®ã¡ãã»ãŒãžã®æš©å©ïŒ
SELECT * FROM `rights_action` WHERE` RightsID` = 100 ãŸã㯠` RightsID` = 101 ãããã§
100-ããŒãžæš©éã®ID
101-ããŒãžäžã®ã¡ãã»ãŒãžã®æš©å©ã®ID
PHPã§ã®éä¿¡ã容æã«ããããã«ãæ§æãå°ãæé©åããŸãã
SELECT * FROM `rights_action` WHERE` RightsID` IN ïŒ100ã101ïŒ
ã¢ã€ãã 2
å¿ èŠãªã¢ã¯ã·ã§ã³ãéžæãããšããã¹ãŠãç°¡åã«ãªããŸãã
SELECT * FROM `rights_action` WHERE` action` = 'message_view'
ã¢ã€ãã 3
ãããŠãããã§ããã€ãã®SELECTãçµã¿åãããå¿ èŠããããŸãã ãŸãããŠãŒã¶ãŒã®ã¢ã¯ã»ã¹æš©ãéžæããŠãããå¿ èŠãªãã®ãšæ¯èŒããŸãã ãããã®ã¢ã¯ã·ã§ã³ã1ã€ã«ãŸãšãããšã以äžãåŸãããŸãã
SELECT * FROM `rights_action` WHERE` GroupID` IN ïŒSELECT` GroupID` FROM` rights_group` WHERE `RightsID` = 1ïŒ
ã¢ã€ãã 1-3ã
1ã€ã®è€éãªã¯ãšãªã§ãã¹ãŠäžç·ã«ãªããŸããïŒ
SELECT * FROM `rights_action` WHERE` RightsID` IN ïŒ100ã101ïŒAND` action` = 'message_view' AND` GroupID` IN ïŒ SELECT `GroupID` FROM` rights_group` WHERE` RightsID` = 1ïŒãã®äŸã§ã¯ããŠãŒã¶ãŒæš©å©ïŒ1ããªããžã§ã¯ãïŒ100ããã³ïŒ101ã®æš©å©ãã¢ã¯ã·ã§ã³ 'ã¡ãã»ãŒãžã®è¡šç€º'ïŒmessage_viewïŒãååŸããçµæïŒç¬Šå·+ããã³-ïŒãçæããŸãã
é ç®1-5ã
ãããPHPå®è£ ã«è²Œãä»ããåæã«ãã§ãã¯ãè¿œå ããŸãã
ããã¯ã»ãã®å§ãŸãã§ãããæåã®ã¹ãããã§ããfunction check( /*array(int,int,...)*/ $obj_rights, /*integer*/ $user_rightsID, /*string*/ $action){
$result = mysql_query( "SELECT * FROM `rights_action` WHERE `RightsID` IN (" . implode( "," ,$obj_rights) . ") AND `action`= '$action' AND `GroupID` IN (SELECT `GroupID` FROM `rights_group` WHERE `RightsID` = $user_rightsID)" );
if (!$result)
return false ;
$tmp=array();
while ($t = mysql_fetch_assoc($result)){
// (Users, User1, Moderator)
// + (0) - (1) ( ).
if (!isset($tmp[$t[ 'groupID' ]]))
$tmp[$t[ 'groupID' ]] = $t[ 'sign' ];
else
$tmp[$t[ 'groupID' ]] |= $t[ 'sign' ];
}
mysql_free_result($result);
if ($tmp)
// + , true. false.
return (array_search(0, $tmp) !== FALSE);
// $tmp == false
return false ;
}
* This source code was highlighted with Source Code Highlighter .
ã¢ã¯ã»ã¹æš©ã¯ã©ã¹ãäœæãã
äœãå¿ èŠã§ããïŒ
ã¯ã©ã¹ã§äœæ¥ããäŸãéçºããŸãã
1ïŒæåã«ã䜿çšããæš©å©ãæã€ãŠãŒã¶ãŒã®æš©å©ãæå®ããå¿ èŠããããŸãã ãŸããã¯ã©ã¹èªäœãç¹å®ã®ãŠãŒã¶ãŒã«ãã€ã³ãããå¿ èŠããããŸãã
2ïŒããããã£ãè¿œå ããŠãåã®æš©å©ã®ã¯ã©ã¹ã«ãªããžã§ã¯ããè¿œå ããŸãã
3ïŒããŸããŸãªã¢ã¯ã·ã§ã³ïŒã¢ã¯ã·ã§ã³ïŒã®ã¢ã¯ã»ã¹ã確èªããŸãã
æèŠãšèãïŒ
__constructã§ã¯ã©ã¹ãäœæãããšãã«ãŠãŒã¶ãŒæš©éãæå®ã§ããŸãã
ã¯ã©ã¹ã®ããããã£ã倱ãããªãããã«æ°ããããããã£ãè¿œå ããå Žåãæ°ããã¯ã©ã¹ãäœæããå¿ èŠããããŸãïŒããããã£ãè¿œå ããŠå€ãã¯ã©ã¹ãè€è£œããŸãïŒã
ããããã¹ãŠå®è£ ããŠã¿ãŸãããã
ããã§ãã³ã³ã¹ãã©ã¯ãã䜿çšã§ããŸããclass Rights{
private $usrID; //User rights ID
function __construct($user_rightsID){
$ this ->usrID=$user_rightsID;
}
}
ããã«å¥ã®ããã°ã©ã ã§$ UserRightsã䜿çšããŸãã$UserRights = new Rights($CurrentUser->rightsID);
確èªããããã«é©åãªãªããžã§ã¯ããè¿œå ããããšãæ€èšããŠãã ããã
ç°ãªãã¡ãã»ãŒãžïŒåïŒããã®æš©å©ïŒèŠªïŒãè¿œå ããããããªããžã§ã¯ããå°ç¡ãã«ããå¿ èŠã¯ãªãããšãæãåºãããŠãã ãããclass Rights{
private $group=array(); //
function include_right($grp){
$clone=clone $ this ; // ,
$clone->group[]=$grp; //
return $clone;
}
//... constructor
}
次ã«ã ãã§ãã¯é¢æ°ãæžãçŽããŠã¯ã©ã¹ã«å°å ¥ããäœãèµ·ãã£ããã確èªããŸãã
çŸåšè¡ã£ãŠããããšïŒé¢æ°ãã¯ã©ã¹ã«åè¿œå ãããã䜿ãããããããæ±çšçã«ããããšïŒã¯ã ãªãã¡ã¯ã¿ãªã³ã°ãšåŒã°ããŸãã ïŒ wiki ïŒclass Rights{
private $usrID; //User rights ID
private $group=array(); //
function __construct($user_rightsID){
$ this ->usrID=$user_rightsID;
}
function include_right($grp){
$clone=clone $ this ; // ,
$clone->group[]=$grp; //
return $clone;
}
function check($action){
$result = mysql_query( "SELECT * FROM `rights_action` WHERE `RightsID` IN (" . implode( "," ,$ this ->group) . ") AND `action`= '$action' AND `GroupID` IN (SELECT `GroupID` FROM `rights_group` WHERE `RightsID` = " . $ this ->usrID . ")" );
if (!$result)
return false ;
$tmp=array();
while ($t = mysql_fetch_assoc($result)){
// (Users, User1, Moderator)
// + (0) - (1) ( ).
if (!isset($tmp[$t[ 'groupID' ]]))
$tmp[$t[ 'groupID' ]] = $t[ 'sign' ];
else
$tmp[$t[ 'groupID' ]] |= $t[ 'sign' ];
}
mysql_free_result($result);
if ($tmp)
// + , true. false.
return (array_search(0, $tmp) !== FALSE);
// $tmp == false
return false ;
}
}
* This source code was highlighted with Source Code Highlighter .
ããã§ããã®ã¯ã©ã¹ã次ã®ããã«äœ¿çšã§ããŸãã
$ CurrentUserã¯ãããŒãžã衚瀺ããŠãããŠãŒã¶ãŒã®æ§é ã§ãã//
$UserRights = new Rights($CurrentUser->rightsID);
// , .
$PageRights = $UserRights->include_right($MainPage->rightsID);
//, ?
if ($PageRights->check( 'messages_view' )){
//, . ?
//
foreach ($MainPage->Messages as $msg){
// (parent), (child)
$MsgRights = $PageRights->include_right($msg->rightsID);
//
if ($MsgRights->check( 'messages_view' )){
// , ?
if ($MsgRights->check( 'messages_edit' ))
$msg->editable_flag = 1;
// ?
if ($MsgRights->check( 'messages_delete' ))
$msg->delete_flag = 1;
DrawMessage($msg);
}
}
}
$ MainPage-ãŠãŒã¶ãŒã衚瀺ããŠããããŒãžæ§é ã
$ MainPage-> Messages-ããŒãžã«è¡šç€ºãããã¡ãã»ãŒãžã®é åã
以åã¯ãæ§é ã¯ããŒã¿ããŒã¹ããèªã¿èŸŒãŸããŠããŸããã
æé©å
ã©ã€ãã©ãªã®å質ãšæ©èœã«ã¯æºè¶³ããŠããŸãããçç£æ§ã®åé¡ãçããŸãã
æåã«ç®ãåŒãã®ã¯ãæ°ãããã¢ã¯ã·ã§ã³ãã䜿çšãããã§ãã¯ããšã«ãå®è¡äžå¯èœãªSQLã¯ãšãªãçºçããããšã§ãã ä¿®æ£ããŠã¿ãŸãããã
ãŸãããªã¯ãšã¹ãããšã«å€åããªããã®ãèŠãŠã¿ãŸãããããããæé©åããŸãã
SELECT * FROM `rights_action` WHERE` RightsID` IN ïŒ.implodeïŒ"ã "ã$ this-> group ïŒïŒAND` action` = '$ action' AND `GroupID` IN ïŒSELECT` GroupID` FROM` rights_group` WHERE `RightsID` =ã$ This-> usrIDïŒ
ãŸãã SELECTã¯ãšãª`GroupID` FROM` rights_group` WHERE` RightsID` = =ã®ãã³ã« ã ããããå§ããŸãããã
UserRightsã宣èšãããšãããã®ã¯ãšãªã1åå®è¡ãããšãçµæãæ¢ã«SQLã¯ãšãªã«æ¿å ¥ãããŸãã
ããã§$ this-> usrIDã«ã¯ãSELECTaå šäœã§ã¯ãªããã¯ãšãªã«çŽæ¥æ¿å ¥ã§ããæ¢è£œã®æååããããŸããfunction __construct($grp){
$result=mysql_query( "SELECT `group_rights`.groupID FROM `group_rights` WHERE `group_rights`.rightsID=$grp" );
$ this ->usrID=array();
while ($t=mysql_fetch_assoc($result)){
$ this ->usrID[]=$t[ 'groupID' ];
}
mysql_free_result($result);
$ this ->usrID=implode( "," ,$ this ->usrID);
}
ãã§ã«ç°¡åã«ãªã£ãŠããŸãããããã§ãåãªã¯ãšã¹ãã«å¯ŸããŠããŒã¿ããŒã¹å šäœã§æ€çŽ¢ãè¡ãããŸãã ã©ãããã°ãããåãé€ãããšãã§ããŸããïŒ ã»ãšãã©ã®å Žåãã¢ã¯ã·ã§ã³ã®ã¿ã«äŸåããäºåçãªçµæãäœæããŸã-ãRightsIDããšãGroupIDãã®éžæã¯å€æŽãããªãããã§ãã
ãªããžã§ã¯ãã®ã°ã«ãŒããè¿œå ããããšãããŒã¿ããŒã¹ãããã¹ãŠã®çµæãé åã«èªã¿èŸŒãŸããŸããé åã¯ãã¢ã¯ã·ã§ã³ãã®å€ã®ã¿ã«äŸåããŸãã
SELECT * FROM `rights_action` WHERE `RightsID` IN (...) AND `GroupID` IN (...)
次ã«ãé åå ã®åãã¢ã¯ã·ã§ã³ããæ¢ã«ãœãŒãããŠãå¿ èŠãªèŠçŽ ãæ¢ããŠããŸãã åæã«ãããŒã¿ããŒã¹ã«ã¯ãã以äžã®ã¯ãšãªã¯ãããŸãã-æ°ããæš©éãæã€æ¬¡ã®ãªããžã§ã¯ããŸã§ã
æé©åã®çµæãã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
class Rights{
private $group= "" ;
private $usrID=array();
private $temptable= "" ;
function include_right($grp){
$clone=clone $ this ;
$clone->group[]=$grp;
$result=mysql_query( "SELECT * FROM `action_rights` WHERE `action_rights`.groupID IN ({$this->usrID}) AND `action_rights`.rightsID IN (" .implode( "," ,$clone->group). ")" );
$tmp=array();
while ($t=mysql_fetch_assoc($result)){
$tmp[]=$t;
}
mysql_free_result($result);
$clone->temptable=$tmp;
return $clone;
}
function check($action){
$tmp=array();
foreach ($ this ->temptable as $t){
if ($t[ 'action' ]==$action){
if (!isset($tmp[$t[ 'groupID' ]]))
$tmp[$t[ 'groupID' ]]=$t[ 'sign' ];
else
$tmp[$t[ 'groupID' ]]|=$t[ 'sign' ];
}
}
if ($tmp){
return (array_search(0,$tmp)!==FALSE);
}
return false ;
}
function __construct($grp){
$result=mysql_query( "SELECT `group_rights`.groupID FROM `group_rights` WHERE `group_rights`.rightsID=$grp" );
$ this ->usrID=array();
while ($t=mysql_fetch_assoc($result)){
$ this ->usrID[]=$t[ 'groupID' ];
}
mysql_free_result($result);
$ this ->usrID=implode( "," ,$ this ->usrID);
}
}
* This source code was highlighted with Source Code Highlighter .
ããã«é«éã§ããïŒ
ã¯ããã§ããŸãã
1ïŒããšãã°ãã¡ãã»ãŒãžïŒåïŒã®ç©ºã®æš©éã°ã«ãŒããèæ ®ããå Žåãæ¢ã«äœ¿çšãããŠããäžæããŒãã«ã¯å€æŽãããŸããã ãã®å Žåãæ°ãã«äœæããããšãªã䜿çšã§ããŸãã æ€èšŒã®ããã«ããã1ã€ã ãSELECTã«ãŠã³ãïŒ*ïŒFROM `action_rights` WHERE` GroupID` = ...ãè¿œå ããå¿ èŠããããŸããããã¯ã€ã³ããã¯ã¹ãééããŠçµæãè¿ããŸãã
2ïŒããŒãã«ãaction_rightsããšãgroup_rightsãã®ã€ã³ããã¯ã¹ãæ£ããé 眮ããŸãã
ããã§ã¯ããããŸããã å°é家ã¯ã圌ããç§ãä¿®æ£ããããšãé¡ã£ãŠããŸãã å人çã«äœæãããPK-ãrightsIDãããactionãããgroupIDããINDEX-ãgroupIDãããrightsIDã
3ïŒäžæããŒãã«ãäœæããåŸã 'action'ã§ã€ã³ããã¯ã¹ãè¿œå ããŸãïŒ ALTER TABLE `{$ this-> temptable}` ADD INDEX ïŒ `action`ïŒ ã
確ãã«ããã®æ¹æ³ãå¹æçãã©ããã¯ããããŸããã å°é家ãç®èº«ããŠãã ããã :)
4ïŒãã£ãã·ã¥ã䜿çšããŸãã ããããããã¯å¥ã®è©±ã§ã:)
å®æœäŸ
ä»æ¥ã¯ããã§ååãªã³ãŒãã ãšæããŸãã ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
äœæ¥äŸ -æ確ãã®æ¬ åŠããIã³ç³ãäžããŸãã
test.phpïŒåäœäŸïŒ-SQLããŒã¿ããŒã¹ã§åäœããç§ã®ã©ã€ãã©ãªãããã§äœ¿çšãããŠããŸãããé©ããªãã§ãã ããã ãã£ãšãç解ããã ãããšæããŸãã
rights.phpã¯ç§ãã¡ã®ã©ã€ãã©ãªã§ãã
æ¡åŒµæ§
ãããžã§ã¯ãã§äœ¿çšããæ°ããã¢ã¯ã·ã§ã³ã¯ãã¹ãŠããã¢ã¯ã·ã§ã³ãENUMã«è¿œå ãããŸãã
ç¹å®ã®ã¢ã¯ã·ã§ã³ã«é¢é£ä»ããŠãªã¢ã«ã¿ã€ã ã§è¿œå ããããªãå Žåã¯ããã¢ã¯ã·ã§ã³ãENUMãæŽæ°ã«çœ®ãæããaction_nameã§å¥ã®actionID察å¿è¡šãäœæããå¿ èŠããããŸãã ïŒã°ã«ãŒãã®ååã§è¡ã£ãããã«ïŒ
æŽæ°ïŒç¶ç¶ããããŸããïŒ Webã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ã»ã¹æš©ã®åé¢ã·ã¹ãã ã®æé©å