2.4. °²È«¶ÔÏó
Èç¹ûÄãÊìϤAOP£¬Äã»áÖªµÀÓкܶàÖÖadvice¿ÉÓãºbefore, after, throws ºÍ around¡£around advice·Ç³£ÓÐÓã¬ÒòΪËüÄܹ»Ñ¡ÔñÊÇ·ñÑ¡ÔñÊÇ·ñÖ´ÐÐÒ»¸ö·½·¨µ÷Óã¬ÊÇ·ñÐ޸ķµ»ØÖµ£¬ÒÔ¼°ÊÇ·ñÅ׳öÒì³£¡£Acegi Security¶Ô·½·¨µ÷ÓúÍwebÇëÇó¶¼Ìṩaround advice¡£ÎÒÃÇʹÓÃAOPÁªÃËʵÏÖ¶Ô·½·¨µ÷ÓõÄaround advice£¬¶ÔÓÚwebÇëÇóµÄaround adviceÔòÊÇʹÓñê×¼µÄ¹ýÂËÆ÷£¨Filter£©¡£
¶ÔÓÚÄÇЩ²»ÊìϤAOPµÄÈËÀ´Ëµ£¬¹Ø¼üÊÇÒªÀí½âAcegi SecurityÄܹ»°ïÖúÄã±£»¤·½·¨µ÷ÓÃÒÔ¼°webÇëÇó¡£´ó¶àÊýÈ˶Ա£»¤ËûÃÇ·þÎñ²ãµÄ·½·¨µ÷ÓøÐÐËȤ¡£ÕâÊÇÒòΪÔÚµ±Ç°µÄJ2EEÓ¦ÓÃÖУ¬·þÎñ²ã°üº¬ÁË´ó¶àÊýµÄÒµÎñÂß¼£¨ÉùÃ÷£¬×÷Õß²»ÔÞ³ÉÕâÖÖÉè¼Æ£¬·´¶øÖ§³ÖÕýÈ··â×°µÄÁìÓòÄ£ÐÍÒÔ¼°DTO£¬assembly, facade ÒÔ¼° transparent persistence patterns£¬¶ø²»Êǵ±Ç°Ö÷Á÷µÄƶѪģÐÍ£¬ÎÒÃǽ«ÔÚÕâÀïÌÖÂÛ£©¡£Èç¹ûÄãÐèÒª±£»¤service²ãµÄ·½·¨µ÷Óã¬Ê¹Óñê×¼µÄSpring AOPƽ̨£¨»òÕß±»³ÉΪAOP ÁªÃË£¨AOP Alliance£©£©¾Í×ã¹»ÁË¡£Èç¹ûÄãÐèÒªÖ±½Ó¶ÔÁìÓòÄ£ÐͽøÐб£»¤£¬ÄÇô¿ÉÒÔ¿¼ÂÇʹÓÃAspectJ¡£
Äã¿ÉÒÔÑ¡Ôñ¶ÔʹÓÃAspectJ »òÕßAOPÁªÃË£¨AOP Alliance£©¶Ô·½·¨½øÐÐÊÚȨ£¬»òÕßÄã¿ÉÒÔÑ¡ÔñʹÓùýÂËÆ÷£¨filter£©À´¶ÔwebÇëÇó½øÐÐÊÚȨ¡£Ä㽫0¸ö£¬1¸ö£¬2¸ö»òÕß3¸öÕâЩ·½·¨Ò»ÆðʹÓá£Ö÷Á÷µÄÓ÷¨ÊÇÖ´ÐÐһЩwebÇëÇóÊÚȨ£¬ÒÔ¼°ÔÚ·þÎñ²ãʹÓÃAOPÁªÃË£¨AOP Alliance£©¶ÔһЩ·½·¨µ÷ÓÃÊÚȨ¡£
Acegi SecurityʹÓÓ°²È«¶ÔÏ󔣨secure object£©Õâ¸ö´ÊÀ´Ö¸ÈκÎÄܹ»½«°²È«Ó¦ÓÃÓÚÆäÉϵĶÔÏó¡£Ã¿¸öAcegi SecurityÖ§³ÖµÄ°²È«¶ÔÏó¶¼ÓÐ×Ô¼ºµÄÀ࣬ËüÊÇAbstractSecurityInterceptorµÄ×ÓÀà¡£ÖØÒªµÄÒ»µãÊÇ£¬Èç¹ûÒ»¸öprincipalͨ¹ýÈÏÖ¤£¬µ±AbstractSecurityInterceptorÖ´ÐеÄʱºò£¬SecurityContextHolderÖÐÒª°üº¬Ò»¸öÓÐЧµÄAuthentication¡£
AbstractSecurityInterceptorÌṩһ¸ö¹Ì¶¨µÄ¹¤×÷Á÷³ÌÀ´´¦Àí°²È«¶ÔÏóÇëÇó¡£Õâ¸ö¹¤×÷Á÷³Ì°üÀ¨²éÕҺ͵±Ç°ÇëÇóÏà¹ØÁªµÄ“ÅäÖÃÊôÐÔ£¨configuration attributes£©”¡£ÅäÖÃÊôÐÔ£¨configuration attributes£©¿ÉÒÔ±»ÈÏΪÊǶԱ»AbstractSecurityInterceptorʹÓõÄÀàÓÐÌØÊ⺬ÒåµÄ×Ö·û´®¡£ËûÃÇͨ³£Õë¶ÔAbstractSecurityInterceptorʹÓÃXML½øÐÐÅäÖ᣷´Õý£¬AbstractSecurityInterceptor»áѯÎÊAccessDecisionManager “ÕâÊÇÅäÖÃÊôÐÔ£¨configuration attributes£©£¬ÕâÊǵ±Ç°µÄÈÏÖ¤¶ÔÏó£¨Authentication object£©£¬ÕâÊǵ±Ç°ÇëÇóµÄÏêϸÐÅÏ¢£ÄÇôÕâ¸öÌØ¶¨µÄprincipal¿ÉÒÔÖ´ÐÐÕâ¸öÌØ¶¨µÄ²Ù×÷Â𣿔¡£
¼ÙÈçAccessDecisionManagerÅж¨ÔÊÐíÕâ¸öÇëÇó£¬ÄÇôAbstractSecurityInterceptorÒ»°ãÀ´Ëµ¾Í¼ÌÐøÖ´ÐÐÇëÇó¡£ËäÈ»ÕâÑù£¬Óû§ÔÚÉÙÊýÇé¿ö֮ϿÉÄÜÐèÒªÌæ»»SecurityContextÖеÄAuthentication£¬¿ÉÒÔͨ¹ýAccessDecisionManagerµ÷ÓÃÒ»¸öRunAsManagerÀ´ÊµÏÖ¡£ÔÚijЩ²»³£¼ûµÄÇéÐÎÏÂÕ⽫·Ç³£ÓÐÓã¬ÀýÈç·þÎñ²ãµÄ·½·¨ÐèÒªÓÃÁíÒ»ÖÖ±êʶ£¨Éí·Ý£©À´µ÷ÓÃÔ¶³Ìϵͳ¡£Õâ¿ÉÄÜÓÐËù°ïÖú£¬ÒòΪAcegi Security×Ô¶¯ÔÚ²»Í¬µÄ·þÎñÆ÷Ö®¼ä´«²¥°²È«±êʶ£¨¼ÙÉèÄãÕýÈ·ÅäÖÃÁËRMI»òÕßHttpInvoker remoting protocol client£©¡£
Ëæ×Ű²È«¶ÔÏó´¦ÀíºÍ·µ»Ø£Òâζ×Å·½·¨µ÷ÓÃÍê±Ï»òÕß¹ýÂËÆ÷Á´£¨filter chain£©´¦ÀíÍê±Ï£AbstractSecurityInterceptorÓÐ×îºóµÄ»ú»áÀ´´¦Àíµ÷Óá£Õâʱ£¬AbstractSecurityInterceptor¿ÉÄÜ»áÐ޸ķµ»ØµÄ¶ÔÏó¡£ÎÒÃÇ¿ÉÄÜÒªÕâÑù×ö£¬ÒòΪÊÚȨÅжϲ»ÄÜÔÚ°²È«¶ÔÏóµ÷ÓÃ;ÖÐÖ´ÐС£ÓÉÓڸ߶ȵĿɲå°ÎÐÔ£¬Èç¹ûÐèÒªAfterInvocationManager½«¿ØÖÆÈ¨½»¸øAfterInvocationManagerÀ´Êµ¼ÊÐ޸ĶÔÏó¡£Õâ¸öÀàÉõÖÁ¿ÉÒÔ³¹µ×Ìæ»»¶ÔÏ󣬻òÕßÅ׳öÒì³££¬»òÕ߸ù±¾²»ÐÞ¸ÄËü¡£
ÒòΪÊÇAbstractSecurityInterceptorÖÐÐÄÄ£°æÀ࣬¿´ÆðÀ´µÚÒ»¸±²åͼ¸ÃÏ׸øËü¡££¨Òë×¢£ºÔÊÖ²áÀïµÄͼ»µÄÌ«³óªÁË£¬ÎÒÓÃjudeÖØÐ»ÁËÒ»±é£©
ͼ1 ¹Ø¼ü“°²È«¶ÔÏó”Ä£ÐÍ
Ö»ÓÐÄÇЩϣÍûʵÏÖȫеĶÔÇëÇó½øÐнØÈ¡½ØÈ¡ºÍÊÚȨ·½Ê½µÄ¿ª·¢Õß²ÅÐèÒªÖ±½ÓʹÓð²È«¶ÔÏó¡£ÀýÈ磬¿ÉÄܹ¹½¨Ò»¸öÐµİ²È«¶ÔÏó°²È«µ÷ÓÃÒ»¸öÏûϢϵͳ¡£ÈκÎÐèÒª°²È«²¢ÇÒÄܹ»ÌṩһÖÖ½ØÈ¡µ÷Óõķ½Ê½(ÀýÈçAOP around advice semantics)µÄ¶«Î÷¶¼¿ÉÒÔ³ÉΪ°²È«¶ÔÏó¡£ËäÈ»Èç´Ë£¬´ó²¿·ÖµÄSpringÓ¦Óö¼»áÖ»ÊÇ͸Ã÷Ó¦Óõ±Ç°Ö§³ÖµÄÈýÖÖ°²È«¶ÔÏóÀàÐÍ£¨AOP Alliance MethodInvocation, AspectJ JoinPoint ºÍ web request FilterInterceptor£©¡£
2.5. ½áÂÛ
¹§Ï²£¡ÄãÒѾ»ñÈ¡ÁËAcegi Security×ã¹»µÄ¸ÅÀ¨ÐÔµÄͼ¾°À´¿ªÊ¼×ÅÊÖÄãµÄÏîÄ¿¡£ÎÒÃÇ̽¾¿Á˹²Ïí×é¼þ£¬ÈÏÖ¤¹ý³Ì£¬ÒÔ¼°¶Ô“°²È«¶ÔÏó”µÄͨÓÃÊÚȨ¸ÅÄî¡£ÊÖ²áÖеÄÓàϲ¿·ÖÄã¿ÉÄÜÓõ½Ò²¿ÉÄÜÓò»µ½£¬¿ÉÒÔ°´ÕÕÈÎÒâ˳ÐòÔĶÁ¡£
°²»ÕлªµçÄÔѧУרҵְҵ¹æ»®Ê¦ÎªÄãÌṩ¸ü¶à°ïÖú¡¾ÔÚÏß×Éѯ¡¿