±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËApache ShiroÄÜ×öʲô£¿¿ª·¢ÈËÔ±ÈçºÎÔÚÆäÓ¦ÓóÌÐòÖÐʹÓÃShiro£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
1.¼ò½é
»¶ÓÀ´µ½Apache ShiroµÄ10·ÖÖӽ̳̣¡
ͨ¹ýÔĶÁÕâ¸ö¿ìËÙ¼òµ¥µÄ½Ì³Ì£¬Äú½«³ä·ÖÁ˽⿪·¢ÈËÔ±ÈçºÎÔÚÆäÓ¦ÓóÌÐòÖÐʹÓÃShiro¡£¶øÇÒÄãÓ¦¸Ã¿ÉÒÔÔÚ10·ÖÖÓÄÚ×öµ½ÕâÒ»µã¡£
2.¸ÅÀÀ
ʲôÊÇApache Shiro£¿
Apache ShiroÊÇÒ»¸ö¹¦ÄÜÇ¿´óÇÒÒ×ÓÚʹÓõÄJava°²È«¿ò¼Ü£¬Îª¿ª·¢ÈËÔ±ÌṩÁËÒ»¸öÖ±¹Û¶øÈ«ÃæµÄ½â¾ö·½°¸£¬ÓÃÓÚÉí·ÝÑéÖ¤¡¢ÊÚȨ¡¢¼ÓÃܺͻỰ¹ÜÀí¡£
ʵ¼ÊÉÏ£¬ËüʵÏÖÁ˹ÜÀíÓ¦ÓóÌÐò°²È«ÐÔµÄËùÓз½Ã棬ͬʱ¾¡¿ÉÄܱÜÃâ³öÏÖÎÊÌâ¡£Ëü½¨Á¢ÔÚÍêÉÆµÄ½Ó¿ÚÇý¶¯Éè¼ÆºÍÃæÏò¶ÔÏóµÄÔÔòÖ®ÉÏ£¬¿ÉÒÔÔÚÈκÎÄãÏëÏóµÃµ½µÄµØ·½ÊµÏÖ×Ô¶¨ÒåÐÐΪ¡£µ«ÊÇ£¬¶ÔÓÚËùÓÐÊÂÇéÀ´Ëµ£¬Ä¬ÈÏÇé¿ö϶¼ÊǺÏÀíµÄ£¬ÕâÓëÓ¦ÓóÌÐò°²È«ÐÔÊÇÒ»ÑùµÄ¡£ÖÁÉÙÕâÊÇÎÒÃÇËù×·ÇóµÄ¡£
Apache ShiroÄÜ×öʲô£¿
ºÜ¶à¡£µ«ÎÒÃDz»ÏëÀ©ÕÅ¡°¿ìËÙÈëÃÅ¡±µÄÄÚÈÝ¡£Èç¹ûÄúÏëÁ˽âËü¿ÉÒÔΪÄú×öʲô£¬Çë²é¿´ÎÒÃǵŦÄÜÒ³Ãæ¡£´ËÍ⣬Èç¹ûÄú¶ÔÎÒÃÇÈçºÎ¿ªÊ¼ÒÔ¼°ÎªÊ²Ã´´æÔڸе½ºÃÆæ£¬Çë²ÎÔÄShiro
History and MissionÒ³Ãæ¡£
ok£¬ÏÖÔÚÎÒÃÇÀ´×öһЩÊÂÇé°É£¡
×¢Ò⣺
Shiro¿ÉÒÔÔÚÈκλ·¾³ÏÂÔËÐУ¬´Ó×î¼òµ¥µÄÃüÁîÐÐÓ¦ÓóÌÐòµ½×î´óµÄÆóÒµWebºÍ¼¯ÈºÓ¦ÓóÌÐò£¬µ«ÊÇÎÒÃǽ«ÔÚÕâ¸ö¿ìËÙÈëÃÅ(QuickStart)ÖÐʹÓÃÒ»¸ö¼òµ¥µÄ"main"·½·¨À´Íê³ÉÒ»¸ö×î¼òµ¥µÄÀý×Ó£¬ÒÔ±ã¿ÉÒÔ»ñµÃ¶ÔAPIµÄ¸ÐÊÜ¡£
3.ÏÂÔØ
1£©È·±£Äú°²×°ÁËJDK1.6+ºÍMaven 3.0.3+¡£
2£©´ÓÏÂÔØÒ³ÃæÏÂÔØ×îеÄShiro"Ô´´úÂë·Ö·¢"°ü¡£ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇʹÓÃ1.3.2·¢Ðа汾¡£
3£©½âѹԴ´úÂë°ü
$ unzip shiro-root-1.3.2-source-release.zip
4£©½øÈëquickstartĿ¼
$ cdshiro-root-1.3.2/samples/quickstart
5£©ÔËÐÐQuickStart
$mvn compile exec:java
Õâ¸öÄ¿±êÖ»»á´òÓ¡³öһЩÈÕÖ¾ÏûÏ¢£¬ÈÃÄãÖªµÀ·¢ÉúÁËʲô£¬È»ºóÍ˳ö¡ª¡ª(Ö÷ÒªMaven¹¹½¨ÏîÄ¿µÄ¹ý³Ì£¬°üÀ¨ÏÂÔØÒ»Ð©ÓйصÄ×é¼þ£¬ÏÂÔØºó£¬Ï´ÎÔËÐоͲ»ÔÙ´ÎÏÂÔØÁË)¡£ÔÚÔĶÁ±¾¿ìËÙÈëÃÅÖ¸ÄÏʱ£¬ÇëËæÊ±²é¿´samples
/ quickstart / src / main / java / Quickstart.javaϵĴúÂë¡£¸ù¾ÝÐèÒªËæÊ±¸ü¸Ä¸ÃÎļþ²¢ÔËÐÐÉÏÊömvn
compile exec£ºjavaÃüÁî¡£
¡¾×¢£º¡¿
ÎÒÕâÀïÔÚwindows8ÏÂÔËÐеģ¬JDK1.8+maven3.5£»²½ÖèͬÉÏ¡£
ΪÁËÖªµÀÔËÐнá¹û£¬ÎÒÔÚÔ´´úÂëÍ˳öǰλÖüÓÁËÒ»ÐдúÂ룬ÒÔ¹Û²âЧ¹û£º
log.info("\n====This is Quikstart
Exampel.It is done!====");//Ôö¼Ó´úÂëÐÐ
½á¹ûʾÒâͼ£º

4.Quickstart.java
ÉÏÃæÒýÓõÄQuickstart.javaÎļþ°üº¬ÁËËùÓпÉÒÔ°ïÖúÄúÊìϤAPIµÄ´úÂë¡£ÏÖÔÚÈÃÎÒÃǰÑËü·Ö³É´ó¿é£¬ÕâÑùÄã¾Í¿ÉÒÔºÜÈÝÒ×µØÀí½â·¢ÉúÁËʲô¡£
¼¸ºõÔÚËùÓл·¾³ÖУ¬Äú¶¼¿ÉÒÔͨ¹ýÒÔϵ÷ÓûñÈ¡µ±Ç°ÕýÔÚÖ´ÐеÄÓû§£º
Subject currentUser =SecurityUtils.getSubject();
ʹÓÃSecurityUtils.getSubject()£¬ÎÒÃÇ¿ÉÒÔ»ñµÃµ±Ç°ÕýÔÚÖ´ÐеÄSubject¡£Ö÷ÌåÖ»ÊÇÓ¦ÓóÌÐòÓû§µÄÌØ¶¨°²È«"ÊÓͼ"¡£ÎÒÃÇʵ¼ÊÉÏÏë³ÆËüΪ'User(Óû§)'£¬ÒòΪÕâ"ÓеÀÀí"£¬µ«ÎÒÃǾö¶¨²»Õâô¸É£ºÌ«¶àµÄÓ¦ÓóÌÐò¶¼ÓÐÏÖ´æµÄAPI£¬ËüÃÇÒѾӵÓÐ×Ô¼ºµÄUserÀà/¿ò¼Ü£¬ÎÒÃDz»ÏëÓëÕâЩAPI³åÍ»¡£ÁíÍ⣬ÔÚ°²È«ÁìÓò£¬ÊõÓïSubjectʵ¼ÊÉÏÊǹ«ÈϵÄÃüÃû·¨¡£
ok£¬¼ÌÐø...
¶ÀÁ¢Ó¦ÓóÌÐòÖеÄgetSubject()µ÷Ó㬿ÉÄÜ»á¸ù¾ÝÌØ¶¨ÓÚÓ¦ÓóÌÐòµÄλÖÃÖеÄÓû§Êý¾ÝÒÔ¼°·þÎñÆ÷»·¾³£¨ÀýÈçWebÓ¦ÓóÌÐò£©·µ»ØÏàÓ¦Subject£¬²¢¸ù¾ÝÓ뵱ǰÏ̻߳ò´«ÈëÇëÇó¹ØÁªµÄÓû§Êý¾Ý¶ø»ñÈ¡Subject?
¡£
ÏÖÔÚÄãÓÐÒ»¸öÖ÷Ì⣬Äã¿ÉÒÔÓÃËü×öʲô£¿
Èç¹ûÄúÏëÔÚÓ¦ÓóÌÐòµÄµ±Ç°»á»°ÆÚ¼äÏòÓû§Ìṩ¿ÉÓõÄÄÚÈÝ£¬Ôò¿ÉÒÔ»ñµÃËûÃǵĻỰ£º
Session session
= currentUser.getSession();
session.setAttribute( "someKey",
"aValue" ); |
SessionÊÇÒ»¸öShiroÌØ¶¨µÄʵÀý£¬Ëü¸øÄãÌṩÁË´ó¶àÊýϰ¹ßµÄ³£¹æHttpSessionʵÀý£¬µ«ÓÐһЩ¶îÍâµÄºÃ´¦ºÍÒ»¸öºÜ´óµÄÇø±ð£ºËü²»ÐèÒªHTTP»·¾³£¡
Èç¹ûÔÚWebÓ¦ÓóÌÐòÄÚ²¿Êð£¬Ä¬ÈÏÇé¿öÏ»Ự½«»ùÓÚHttpSession¡£µ«ÊÇ£¬ÔÚ·ÇWeb»·¾³ÖУ¬¾ÍÏñÕâ¸ö¼òµ¥µÄ¿ìËÙÈëÃÅÒ»Ñù£¬ShiroĬÈÏ»á×Ô¶¯Ê¹ÓÃËüµÄÆóÒµ»á»°¹ÜÀí¡£ÕâÒâζ×ÅÎÞÂÛ²¿Êð»·¾³ÈçºÎ£¬Äú¶¼¿ÉÒÔÔÚÓ¦ÓóÌÐòÖеÄÈκβãÖÐʹÓÃÏàͬµÄAPI¡£Õ⽫´ò¿ªÒ»¸öȫеÄÓ¦ÓóÌÐòÊÀ½ç£¬ÒòΪÈκÎÐèÒª»á»°µÄÓ¦ÓóÌÐò¶¼²»ÐèÒªÇ¿ÖÆÊ¹ÓÃHttpSession»òEJB
Stateful Session Beans¡£¶øÇÒ£¬Èκοͻ§¶Ë¼¼ÊõÏÖÔÚ¶¼¿ÉÒÔ¹²Ïí»á»°Êý¾Ý¡£
ËùÒÔÏÖÔÚÄã¿ÉÒÔ»ñµÃÒ»¸öSubjectºÍËûÃǵÄSession¡£ÄÇÐ©ÕæÕýÓÐÓõĶ«Î÷±ÈÈç¼ì²éÊÇ·ñÔÊÐíËûÃÇ×öÊÂÇ飬±ÈÈç¼ì²é½ÇÉ«ºÍȨÏÞ£¿
ÄÇô£¬ÎÒÃÇÖ»ÄܶÔÒÑÖªµÄÓû§½øÐÐÕâЩ¼ì²é¡£ÉÏÃæµÄSubjectʵÀý´ú±íµ±Ç°Óû§£¬µ«ËÊǵ±Ç°Óû§£¿Æäʵ£¬ËûÃÇÊÇÄäÃûµÄ
- Ò²¾ÍÊÇ˵£¬Ö±µ½ËûÃǵǼÖÁÉÙÒ»´Î¡£ËùÒÔ£¬ÈÃÎÒÃÇÕâÑù×ö£º
if ( !currentUser.isAuthenticated()
) {
//ÒÔguiÌØ¶¨·½Ê½ÊÕ¼¯Óû§Ö÷ÌåºÍƾ֤-principalsand credentials
//Èçhtml±íµ¥µÄÓû§Ãû/ÃÜÂ룬X509Ö¤Ê飬OpenIDµÈ¡£
//ÎÒÃǽ«ÔÚÕâÀïʹÓÃÓû§Ãû/ÃÜÂëʾÀý£¬ÒòΪËüÊÇ×î³£¼ûµÄ¡£
//(ÄãÖªµÀÕâÊÇʲôµçÓ°Âð£¿;)
UsernamePasswordToken token = newUsernamePasswordToken("lonestarr",
"vespa");
//this isall you have to do to support 'remember
me' (no config - built in!):
//Õâ¾ÍÊÇÄãÐèÒª×öµÄËùÓÐÊÂÇéÒÔ±ãÀ´Ö§³Ö'¼ÇסÎÒ'£¨Ã»ÓÐÅäÖà - ÄÚÖã¡£©
token.setRememberMe(true);
currentUser.login(token);
} |
¸½ÉÏÊö´úÂë½ØÍ¼£¨ÇåÎúЩ:£©

·ç¸ñ»¯´úÂë½ØÍ¼
¾ÍÕâÑù£¡Ã»ÓбÈÕâ¸üÈÝÒ×ÁË¡£
µ«ÊÇ£¬Èç¹ûËûÃǵĵǼ³¢ÊÔʧ°ÜÄØ£¿Äã¿ÉÒÔ²¶×½¸÷ÖÖ¾ßÌåµÄÀýÍâÇé¿ö£¬¸æËßÄãµ½µ×·¢ÉúÁËʲô£¬²¢ÔÊÐíÄãÏàÓ¦µØ´¦ÀíºÍ×ö³ö·´Ó¦£º
try {
currentUser.login( token );
//Èç¹ûûÓÐÀýÍ⣬¾ÍÊÇÕâÑù£¬¸ã¶¨£¡
} catch ( UnknownAccountException uae ) {
//Óû§Ãû²»ÔÚϵͳÖУ¬ÈçºÎÏòËûÃÇÏÔʾ´íÎóÏûÏ¢£¿
} catch ( IncorrectCredentialsException ice) {
//ÃÜÂ벻ƥÅ䣬ÊÇ·ñÔÙÊÔ£¿
} catch ( LockedAccountException lae ) {
//¸ÃÓû§ÃûµÄÕÊ»§±»Ëø¶¨ - ÎÞ·¨µÇ¼¡£ÈçºÎÏÔʾһÌõÏûÏ¢£¿
}
...¸ü¶àÀàÐ͵ÄÒì³£¼ì²é¡ª¡ªÈç¹ûÄãÏëÒª...
} catch ( AuthenticationException ae ) {
//ÒâÍâÇé¿ö - Ôõô´¦Àí?
}
|
¸½ÉÏÊö´úÂë½ØÍ¼

·ç¸ñºÍ´úÂë½ØÍ¼
Äú¿ÉÒÔ¼ì²éÐí¶à²»Í¬ÀàÐ͵ÄÀýÍâÇé¿ö£¬»òÕßÅ׳öShiro¿ÉÄÜÎÞ·¨½âÊ͵Ä×Ô¶¨ÒåÒì³£Çé¿ö¡£Óйظü¶àÐÅÏ¢£¬Çë²ÎÔÄAuthenticationException
JavaDoc¡£
Ìáʾ£º
°²È«×î¼Ñ×ö·¨ÊÇΪÓû§ÌṩͨÓõǼʧ°ÜÏûÏ¢Ìáʾ£¬ÒòΪÄú²»Ï£Íû°ïÖú¹¥»÷ÕßÊÔͼ½øÈëϵͳ¡£
ok£¬µ½ÏÖÔÚΪֹ£¬ÎÒÃÇÓÐÒ»¸öµÇ¼Óû§¡£ÎÒÃÇ»¹ÄÜ×öʲô£¿
ÈÃÎÒÃÇ¿´¿´ËûÃÇÊÇË£º
//´òÓ¡ËûÃǵıêʶÖ÷Ì壨ÔÚÕâÖÖÇé¿öÏÂÊÇÓû§Ãû£©
log.info( "User [" +currentUser.getPrincipal()
+ "] logged in successfully." );
ÎÒÃÇÒ²¿ÉÒÔ²âÊÔËüÃÇÊÇ·ñ¾ßÓÐÌØ¶¨µÄ½ÇÉ«£º
if ( currentUser.hasRole( "schwartz"
) ) {
log.info("May the Schwartz be with you!"
);
} else {
log.info("Hello, mere mortal." );
}
ÎÒÃÇ»¹¿ÉÒÔ¿´µ½ËûÃÇÊÇ·ñÓÐȨ¶ÔijÖÖÀàÐ͵ÄʵÌå²ÉÈ¡Ðж¯:
if ( currentUser.isPermitted("lightsaber:weild"
) ) {
log.info("You may use a lightsaber ring.?
Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for
schwartz mastersonly.");
} |
ÁíÍ⣬ÎÒÃÇ¿ÉÒÔÖ´Ðзdz£Ç¿´óµÄʵÀý¼¶È¨ÏÞ¼ì²é - ²é¿´Óû§ÊÇ·ñÓÐȨ·ÃÎÊÌØ¶¨ÀàÐÍʵÀýµÄ¹¦ÄÜ
if ( currentUser.isPermitted("winnebago:drive:eagle5"
) ) {
log.info("You are permitted to 'drive' the
'winnebago' with licenseplate (id) 'eagle5'.?
" +
"Here are the keys - have fun!");
} else {
log.info("Sorry, you aren't allowed to drive
the 'eagle5'winnebago!");
}
|
С²ËÒ»µú£¬¶Ô°É£¿
×îºó£¬µ±Óû§Íê³ÉʹÓÃÓ¦ÓóÌÐòʱ£¬ËûÃÇ¿ÉÒÔ×¢Ïú£º
currentUser.logout(); //ɾ³ýËùÓбêʶÐÅÏ¢²¢Ê¹Æä»á»°ÎÞЧ¡£
ÄÇô£¬Õâ¾ÍÊÇÔÚÓ¦ÓóÌÐò¿ª·¢ÈËÔ±¼¶±ðʹÓÃApache ShiroµÄºËÐÄ¡£ËäÈ»ÓÐһЩ·Ç³£¸´ÔӵĶ«Î÷ÔÚÒýÇæ¸ÇϽøÐУ¬Ê¹µÃÕâÏ×÷Èç´ËÓÅÑÅ£¬µ«ÕâȷʵÊÇËüµÄÈ«²¿¡£
µ«ÊÇÄã¿ÉÄÜ»áÎÊ×Ô¼º£¬"µ«ÊÇ˸ºÔðÔڵǼʱ»ñÈ¡Óû§Êý¾Ý£¨Óû§ÃûºÍÃÜÂ룬½ÇÉ«ºÍȨÏ޵ȣ©£¬ÒÔ¼°ËÔÚÔËÐÐÊ±ÕæÕýÖ´ÐÐÕâЩ°²È«¼ì²é£¿"£¬ÕâôÎʾͶÔÁË¡ª¡ªÄãÀ´×ö£ºÍ¨¹ýʵʩ
Shiro³ÆÖ®ÎªRealmµÄ¶«Î÷£¬²¢½«¸ÃRealm²åÈëµ½ShiroµÄÅäÖÃÖÐÀ´Íê³É¡£
µ«ÊÇ£¬ÈçºÎÅäÖÃRealmºÜ´ó³Ì¶ÈÉÏÈ¡¾öÓÚÄúµÄÔËÐÐʱ»·¾³¡£ÀýÈ磬Èç¹ûÔËÐжÀÁ¢Ó¦ÓóÌÐò£¬»òÕßÈç¹ûÄúÓлùÓÚWebµÄÓ¦ÓóÌÐò£¬»ò»ùÓÚSpring»òJEEÈÝÆ÷µÄÓ¦ÓóÌÐò»òÆä×éºÏ£¬ÕâÖÖÀàÐ͵ÄÅäÖò»ÔÚ±¾¿ìËÙÈëÃŵķ¶Î§Ö®ÄÚ£¬ÒòΪËüµÄÄ¿µÄÊÇÈÃÄú¶ÔAPIºÍShiroµÄ¸ÅÄî¸Ðµ½ÂúÒâ¡£
µ±Äú×¼±¸ºÃÁ˽â¸ü¶àϸ½Úʱ£¬ÄúÒ»¶¨ÒªÔĶÁÈÏÖ¤Ö¸ÄϺÍÊÚȨָÄÏ¡£È»ºó¿ÉÒÔתµ½ÆäËûÎĵµ£¬ÌرðÊDzο¼ÊÖ²áÖУ¬ÒԻشðÈÎºÎÆäËûÎÊÌâ¡£ÄúÒ²¿ÉÄÜÏëÒª¼ÓÈëÓû§ÓʼþÁбí
- Äú»á·¢ÏÖÎÒÃÇÓÐÒ»¸ö·Ç³£°ôµÄÉçÇø£¬Ö»ÒªÓпÉÄÜ£¬ËûÃǶ¼Ô¸ÒâÌṩ°ïÖú¡£

|