## Shiro
* [1.ä»ä¹æ¯shiro](#1ä»ä¹æ¯shiro)
* [2.è§£éä¸Shiroçæ ¸å¿æ¦å¿µï¼SubjectãSecurityManagerãRealm](#2è§£éä¸shiroçæ ¸å¿æ¦å¿µsubjectsecuritymanagerrealm)
* [3.Shiroçä¼ç¹](#3shiroçä¼ç¹)
* [4.Shiroæåªäºç»ä»¶ï¼](#4shiroæåªäºç»ä»¶)
* [5.说ä¸Authentication 身份éªè¯çæµç¨](#5说ä¸authentication-身份éªè¯çæµç¨)
* [6.Authorization ææçæ¹å¼åæµç¨æ¯ææ ·çï¼](#6authorization-ææçæ¹å¼åæµç¨æ¯ææ ·ç)
* [7.Cryptography å å¯çè¿ç¨æ¯è¿æ ·çï¼](#7cryptography-å å¯çè¿ç¨æ¯è¿æ ·ç)
* [8.Realm åå¦ä½ä½¿ç¨ï¼](#8realm-åå¦ä½ä½¿ç¨)
* [9.shiroæ¦æªå¨çæ§è¡æµç¨](#9shiroæ¦æªå¨çæ§è¡æµç¨)
* [10.Session Manager ä¼è¯ç®¡çä»ç»ä¸ä¸](#10session-manager-ä¼è¯ç®¡çä»ç»ä¸ä¸)
* [åèèµæ](#åèèµæ)
#### 1.ä»ä¹æ¯shiro
Shiroæ¯ä¸ä¸ªå¼ºå¤§æç¨çjavaå®å
¨æ¡æ¶ï¼æä¾äºè®¤è¯ãææãå å¯ãä¼è¯ç®¡çãä¸webéæãç¼åçåè½ï¼å¯¹äºä»»ä½ä¸ä¸ªåºç¨ç¨åºï¼é½å¯ä»¥æä¾å
¨é¢çå®å
¨æå¡ï¼ç¸æ¯å
¶ä»å®å
¨æ¡æ¶ï¼shiroè¦ç®åçå¤ã
#### 2.è§£éä¸Shiroçæ ¸å¿æ¦å¿µï¼SubjectãSecurityManagerãRealm
Subjectï¼ä¸»ä½ï¼ä»£è¡¨äºå½åâç¨æ·âï¼è¿ä¸ªç¨æ·ä¸ä¸å®æ¯ä¸ä¸ªå
·ä½ç人ï¼ä¸å½ååºç¨äº¤äºçä»»ä½ä¸è¥¿é½æ¯Subjectï¼å¦ç¬è«ãæºå¨äººçï¼å³ä¸ä¸ªæ½è±¡æ¦å¿µï¼ææSubjecté½ç»å®å°SecurityManagerï¼ä¸Subjectçææäº¤äºé½ä¼å§æç»SecurityManagerï¼å¯ä»¥æSubject认为æ¯ä¸ä¸ªé¨é¢ï¼SecurityManagerææ¯å®é
çæ§è¡è
ã
SecurityManagerï¼å®å
¨ç®¡çå¨ï¼å³ææä¸å®å
¨æå
³çæä½é½ä¼ä¸SecurityManager交äºï¼ä¸å®ç®¡ççææSubjectï¼å¯ä»¥çåºå®æ¯shiroçæ ¸å¿, SecurityManagerç¸å½äºspring mvcä¸çdispatcherServletå端æ§å¶å¨ã
Realmï¼åï¼shiroä»Realmè·åå®å
¨æ°æ®(å¦ç¨æ·ãè§è²ãæé)ï¼å°±æ¯è¯´SecurityManagerè¦éªè¯ç¨æ·èº«ä»½ï¼é£ä¹å®éè¦ä»Realmè·åç¸åºçç¨æ·è¿è¡æ¯è¾ä»¥ç¡®å®ç¨æ·èº«ä»½æ¯å¦åæ³ï¼ä¹éè¦ä»Realmå¾å°ç¨æ·ç¸åºçè§è²/æéè¿è¡éªè¯ç¨æ·æ¯å¦è½è¿è¡æä½ï¼å¯ä»¥æRealmçæDataSourceï¼å³å®å
¨æ°æ®æºã
#### 3.Shiroçä¼ç¹
1ã ç®åç身份éªè¯ï¼æ¯æå¤ç§æ°æ®æº
2ã对è§è²çç®åææï¼æ¯æç»ç²åº¦çææï¼æ¹æ³ï¼
3ãæ¯æä¸çº§ç¼åï¼ä»¥æååºç¨ç¨åºçæ§è½
4ãå
ç½®åºäºPOJOçä¼ä¸ä¼è¯ç®¡çï¼éç¨äºwebåéwebç¯å¢
5ãé常ç®åçAPIå å¯
6ãä¸è·ä»»ä½æ¡æ¶ç»å®ï¼å¯ä»¥ç¬ç«è¿è¡
#### 4.Shiroæåªäºç»ä»¶ï¼
Authenticationï¼èº«ä»½è®¤è¯/ç»å½ï¼éªè¯ç¨æ·æ¯ä¸æ¯æ¥æç¸åºç身份ï¼
Authorizationï¼ææï¼å³æééªè¯ï¼éªè¯æä¸ªå·²è®¤è¯çç¨æ·æ¯å¦æ¥ææä¸ªæéï¼å³å¤æç¨æ·æ¯å¦è½åäºæ
ï¼å¸¸è§çå¦ï¼éªè¯æä¸ªç¨æ·æ¯å¦æ¥ææä¸ªè§è²ãæè
ç»ç²åº¦çéªè¯æä¸ªç¨æ·å¯¹æä¸ªèµæºæ¯å¦å
·ææä¸ªæéï¼
Session Managerï¼ä¼è¯ç®¡çï¼å³ç¨æ·ç»å½åå°±æ¯ä¸æ¬¡ä¼è¯ï¼å¨æ²¡æéåºä¹åï¼å®çææä¿¡æ¯é½å¨ä¼è¯ä¸ï¼ä¼è¯å¯ä»¥æ¯æ®éJavaSEç¯å¢çï¼ä¹å¯ä»¥æ¯å¦Webç¯å¢çï¼
Cryptographyï¼å å¯ï¼ä¿æ¤æ°æ®çå®å
¨æ§ï¼å¦å¯ç å å¯åå¨å°æ°æ®åºï¼è䏿¯ææåå¨ï¼
Web Supportï¼Webæ¯æï¼å¯ä»¥é常容æçéæå°Webç¯å¢ï¼
Cachingï¼ç¼åï¼æ¯å¦ç¨æ·ç»å½åï¼å
¶ç¨æ·ä¿¡æ¯ãæ¥æçè§è²/æéä¸å¿
æ¯æ¬¡å»æ¥ï¼è¿æ ·å¯ä»¥æé«æçï¼
Concurrencyï¼shiroæ¯æå¤çº¿ç¨åºç¨çå¹¶åéªè¯ï¼å³å¦å¨ä¸ä¸ªçº¿ç¨ä¸å¼å¯å¦ä¸ä¸ªçº¿ç¨ï¼è½ææéèªå¨ä¼ æè¿å»ï¼
Testingï¼æä¾æµè¯æ¯æï¼
Run Asï¼å
许ä¸ä¸ªç¨æ·åè£
为å¦ä¸ä¸ªç¨æ·ï¼å¦æä»ä»¬å
许ï¼ç身份è¿è¡è®¿é®ï¼
Remember Meï¼è®°ä½æï¼è¿ä¸ªæ¯é常常è§çåè½ï¼å³ä¸æ¬¡ç»å½åï¼ä¸æ¬¡åæ¥çè¯ä¸ç¨ç»å½äºã
è®°ä½ä¸ç¹ï¼Shiroä¸ä¼å»ç»´æ¤ç¨æ·ãç»´æ¤æéï¼è¿äºéè¦æä»¬èªå·±å»è®¾è®¡/æä¾ï¼ç¶åéè¿ç¸åºçæ¥å£æ³¨å
¥ç»Shiroå³å¯ã
#### 5.说ä¸Authentication 身份éªè¯çæµç¨
principalsï¼èº«ä»½ï¼å³ä¸»ä½çæ è¯å±æ§ï¼å¯ä»¥æ¯ä»»ä½ä¸è¥¿ï¼å¦ç¨æ·åãé®ç®±çï¼å¯ä¸å³å¯ã
credentialsï¼è¯æ/åè¯ï¼å³åªæä¸»ä½ç¥éçå®å
¨å¼ï¼å¦å¯ç /æ°åè¯ä¹¦çã
èº«ä»½è®¤è¯æµç¨ï¼
1ï¼é¦å
è°ç¨Subject.login(token)è¿è¡ç»å½ï¼å
¶ä¼èªå¨å§æç»SecurityManagerï¼è°ç¨ä¹åå¿
é¡»éè¿SecurityUtils.setSecurityManager()设置ï¼
2ï¼SecurityManagerè´è´£çæ£ç身份éªè¯é»è¾ï¼å®ä¼å§æç»Authenticatorè¿è¡èº«ä»½éªè¯ï¼
3ï¼Authenticatorææ¯çæ£ç身份éªè¯è
ï¼shiro api䏿 ¸å¿ç身份认è¯å
¥å£ç¹ï¼æ¤å¤å¯ä»¥èªå®ä¹æå
¥èªå·±çå®ç°ï¼
4ï¼Authenticatorå¯è½ä¼å§æç»ç¸åºçAuthenticationStrategyè¿è¡å¤Realm身份éªè¯ï¼é»è®¤ModularRealmAuthenticatorä¼è°ç¨AuthenticationStrategyè¿è¡å¤Realm身份éªè¯ï¼
5ï¼Authenticator伿ç¸åºçtokenä¼ å
¥Realmï¼ä»Realmè·å身份éªè¯ä¿¡æ¯ï¼å¦ææ²¡æè¿å/æåºå¼å¸¸è¡¨ç¤ºèº«ä»½éªè¯å¤±è´¥äºãæ¤å¤å¯ä»¥é
ç½®å¤ä¸ªRealmï¼å°æç
§ç¸åºç顺åºåçç¥è¿è¡è®¿é®ã
6ï¼Authenticatorçèè´£æ¯éªè¯ç¨æ·è´¦å·ï¼æ¯shiro apiä¸èº«ä»½éªè¯æ ¸å¿çå
¥å£ç¹ã
7ï¼AuthenticationStrategy 认è¯çç¥ ModularRealmAuthenticatoré»è®¤ä½¿ç¨AtLeastOneSuccessfulStrategyçç¥
1> FirstSuccessfulStrategyï¼åªè¦æä¸ä¸ªRealméªè¯æåå³å¯ï¼åªè¿å第ä¸ä¸ªRealm身份éªè¯æåç认è¯ä¿¡æ¯ï¼å
¶ä»ç忽ç¥ï¼
2> AtLeastOneSuccessfulStrategyï¼åªè¦æä¸ä¸ªRealméªè¯æåå³å¯ï¼åFirstSuccessfulStrategyä¸åï¼è¿åææRealm身份éªè¯æåç认è¯ä¿¡æ¯ï¼
3> AllSuccessfulStrategyï¼ææRealméªè¯æåæç®æåï¼ä¸è¿åææRealm身份éªè¯æåç认è¯ä¿¡æ¯ï¼å¦ææä¸ä¸ªå¤±è´¥å°±å¤±è´¥äºã
#### 6.Authorization ææçæ¹å¼åæµç¨æ¯ææ ·çï¼
ææï¼ä¹å«è®¿é®æ§å¶ï¼å³å¨åºç¨ä¸æ§å¶è°è½è®¿é®åªäºèµæºï¼å¦è®¿é®é¡µé¢/ç¼è¾æ°æ®/页颿ä½çï¼ã卿æä¸éäºè§£çå 个å
³é®å¯¹è±¡ï¼ä¸»ä½(Subject)ãèµæºï¼Resourceï¼ãæéï¼Permissionï¼ãè§è²ï¼Roleï¼
æææ¹å¼ï¼
1ï¼ç¼ç¨å¼ï¼éè¿åif/elseææä»£ç 宿
Subject subject = SecurityUtils.getSubject();
If(subject.hasRole(âadminâ){
// ææé
}else{
// æ æé
}
2ï¼æ³¨è§£
@RequiresRoles(âadminâ)
public void helloWord(){
// ææé
}
3ï¼Jsp/gspæ ç¾
<!âææé ï
åºäºèµæºçè®¿é®æ§å¶
1ï¼ éå¼è§è²ï¼ç¡¬ç¼ç çæ¹å¼ï¼if/elseï¼ï¼ç²ç²åº¦é æçé®é¢ï¼å¦ææä¸å¤©ä¸éè¦äºé£ä¹å°±éè¦ä¿®æ¹ç¸åºä»£ç æææç¸å
³çå°æ¹è¿è¡å é¤ï¼
4ï¼æ¾ç¤ºè§è²ï¼è§åï¼èµæºæ è¯ç¬¦ï¼æä½ï¼user:create,user:updateï¼è¿ç§æ¹å¼å«èµæºçº§å«çç²åº¦ï¼å¥½å¤ï¼å¦æéè¦ä¿®æ¹é½æ¯ä¸ä¸ªèµæºçº§å«çä¿®æ¹ï¼ä¸ä¼å¯¹å
¶ä»æ¨¡å代ç 产çå½±åï¼ç²åº¦å°ï¼ä½å®ç°èµ·æ¥å¯è½ç¨å¾®å¤æç¹ï¼éè¦ç»´æ¤âç¨æ·âè§è²ï¼è§è²âæéï¼èµæºï¼æä½ï¼âä¹é´çå
³ç³»
Permission
å符串éé
符æé
è§åï¼èµæºæ è¯ç¬¦ : æä½ : 对象å®ä¾ID
â:âè¡¨ç¤ºèµæº/æä½/å®ä¾çåå²
â,â表示æä½çåå²
â*â表示任æèµæº/æä½/å®ä¾
5ï¼åä¸ªèµæºå¤ä¸ªæé
Role=system:user:update,system:user:delete
çä»·äºrole=system:user:update,deleteï¼ä½æ¯åè¿æ¥æ¯è§å䏿ç«
代ç 夿
subject().checkPermissions(âsystem:user:update,deleteâ)
6ï¼åä¸ªèµæºå
¨é¨æéï¼role=sys:user:*/sys:user
7ï¼ææèµæºå
¨é¨æéï¼role=*:viewï¼subject.checkPermissions(âuser:viewâ);
8ï¼å®ä¾çº§å«çæé
åå®å¤éï¼role=âuser:update,delete:1â;
subject().checkPermissions(âuser:update,delete:1â);
allå®åéï¼role=âuser:auth:â;
subject().checkPermissions(âuser:auth:1â, âuser:auth:2â);
allå®alléï¼role=âuser:?â;
subject().checkPermissions(âuser:view:1â, âuser:auth:2â);
æææµç¨ï¼
1ï¼é¦å
è°ç¨Subject.isPermitted*/hasRole*æ¥å£ï¼å
¶ä¼å§æç»SecurityManagerï¼èSecurityManageræ¥çä¼å§æç»Authorizerï¼
2ï¼Authorizeræ¯çæ£çææè
ï¼å¦ææä»¬è°ç¨å¦isPermitted(âuser:viewâ), å
¶é¦å
ä¼éè¿PermissionResolveræåç¬¦ä¸²è½¬æ¢æç¸åºçPermissionå®ä¾ï¼
3ï¼å¨è¿è¡ææä¹åï¼å
¶ä¼è°ç¨ç¸åºçRealmè·åSubjectç¸åºçè§è²/æéç¨äºå¹é
ä¼ å
¥çè§è²/æéï¼
4ï¼Authorizerä¼å¤æRealmçè§è²/æéæ¯å¦åä¼ å
¥çå¹é
ï¼å¦ææå¤ä¸ªRealmï¼ä¼å§æç»ModularRealmAuthorizerè¿è¡å¾ªç¯å¤æï¼å¦æå¹é
å¦isPermitted*/hasRole*ä¼è¿åtrue, å¦åè¿åfalse表示ææå¤±è´¥ã
#### 7.Cryptography å å¯çè¿ç¨æ¯è¿æ ·çï¼
ç¼ç /è§£ç
Shiroæä¾äºbase64å16è¿å¶å符串ç¼ç /è§£ç çAPIæ¯æ,æ¹ä¾¿ä¸äºç¼ç è§£ç æä½
Base64.encodeToString(str.getBytes())ç¼ç
Base64.decodeToString(base64Encoded) è§£ç
æ£åç®æ³
å¸¸è§æ£åç®æ³å¦MD5,SHAç
1ï¼é¦å
å建ä¸ä¸ªDfaultHashService,é»è®¤ä½¿ç¨SHA-512ç®æ³ï¼
2ï¼å¯ä»¥éè¿hashAlgorithmName屿§ä¿®æ¹ç®æ³ï¼
3ï¼å¯ä»¥éè¿privateSalt设置ä¸ä¸ªç§çï¼å
¶å¨æ£åæ¶èªå¨ä¸ç¨æ·ä¼ å
¥çå
¬çæ··å产çä¸ä¸ªæ°çï¼
4ï¼å¯ä»¥éè¿generatePublicSalt屿§å¨ç¨æ·æ²¡æä¼ å
¥å
¬ççæ
åµä¸æ¯å¦çæå
¬çï¼
5ï¼å¯ä»¥è®¾ç½®randomNumberGeneratorç¨äºçæå
¬çï¼
6ï¼å¯ä»¥è®¾ç½®hashIterations屿§æ¥ä¿®æ¹é»è®¤å å¯è¿ä»£æ¬¡æ°ï¼
7ï¼éè¦æå»ºä¸ä¸ªHashRequest,ä¼ å
¥ç®æ³ãæ°æ®ãå
¬çãè¿ä»£æ¬¡æ°ã
çæéæºæ°
SecureRandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
randomNumberGenerator.setSeed(â159â.getBytes());
String hex = randomNumberGenerator.nextBytes().toHex();
å å¯/è§£å¯
æä¾å¯¹ç§°å¼å å¯/è§£å¯ç®æ³çæ¯æï¼å¦AESãBlowfishç
PasswordService/CredentialsMatcher
ç¨äºæä¾å å¯å¯ç åéªè¯å¯ç æå¡
Shiroé»è®¤æä¾äºPasswordServiceå®ç°DefaultPasswordService;CredentialsMatcherå®ç°PasswordMatcheråHashedCredentialsMatcher(æ´å¼ºå¤§)
HashedCredentialsMatcherå®ç°å¯ç éªè¯æå¡
Shiroæä¾äºCredentialsMatcherçæ£åå®ç°HashedCredentialsMatcher,åPasswordMatcherä¸åçæ¯ï¼å®åªæ¯ç¨äºå¯ç éªè¯ï¼ä¸å¯ä»¥æä¾èªå·±ççï¼è䏿¯éæºçæçï¼ä¸çæå¯ç æ£åå¼çç®æ³éè¦èªå·±åï¼å ä¸ºè½æä¾èªå·±çç
#### 8.Realm åå¦ä½ä½¿ç¨ï¼
å®ä¹Realmï¼èªå®ä¹Realmç»§æ¿AuthorizingRealmå³å¯ï¼
1ï¼UserRealmç¶ç±»AuthorizingRealmå°è·åSubjectç¸å
³ä¿¡æ¯åæä¸¤æ¥ï¼è·å身份éªè¯ä¿¡æ¯ï¼doGetAuthenticationInfoï¼åææä¿¡æ¯ï¼doGetAuthorizationInfoï¼
2ï¼doGetAuthenticationInfoè·å身份éªè¯ç¸å
³ä¿¡æ¯ï¼é¦å
æ ¹æ®ä¼ å
¥çç¨æ·åè·åUserä¿¡æ¯ï¼å¦æuser为空ï¼é£ä¹æåºæ²¡æ¾å°è´¦å·å¼å¸¸UnknownAccountExecptionï¼å¦æuseræ¾å°ä½å´è¢«éå®äºæåºéå®å¼å¸¸LockedAccountExceptionï¼æåçæAuthenticationInfoä¿¡æ¯ï¼äº¤ç»é´æ¥ç¶ç±»AuthenticatingRealm使ç¨CredentialsMatcherè¿è¡å¤æå¯ç æ¯å¦å¹é
ï¼å¦æä¸å¹é
å°æåºå¯ç é误å¼å¸¸ä¿¡æ¯IncorrectCredentialsExceptionï¼å¦æå¯ç éè¯æ¬¡æ°å¤ªå¤å°æåºè¶
åºéè¯æ¬¡æ°å¼å¸¸ExcessiveAttemptsExceptionï¼å¨ç»è£
SimpleAuthenticationInfoä¿¡æ¯æ¶ï¼éè¦ä¼ å
¥ï¼èº«ä»½ä¿¡æ¯ï¼ç¨æ·åï¼ãåæ®ï¼å¯æå¯ç ï¼ãçï¼username+saltï¼ï¼CredentialsMatcher使ç¨çå å¯ä¼ å
¥çææå¯ç 忤å¤ç坿å¯ç è¿è¡å¹é
ã
3ï¼doGetAuthorizationInfoè·åææä¿¡æ¯ï¼PrincipalCollectionæ¯ä¸ä¸ªèº«ä»½éåï¼å 为åªç¨å°äºä¸ä¸ªRealmï¼æä»¥ç´æ¥è°ç¨getPrimaryPrincipalå¾å°ä¹åä¼ å
¥çç¨æ·åå³å¯ï¼ç¶åæ ¹æ®ç¨æ·åè°ç¨UserServiceæ¥å£è·åè§è²åæéä¿¡æ¯ã
AuthenticationInfoç两个ä½ç¨
1ï¼å¦æRealmæ¯AuthenticatingRealmåç±»ï¼åæä¾ç»AuthenticatingRealmå
é¨ä½¿ç¨çCredentialsMatcherè¿è¡åæ®éªè¯ï¼ï¼å¦ææ²¡æç»§æ¿å®éè¦å¨èªå·±çRealmä¸å®ç°éªè¯ï¼ï¼
2ï¼æä¾ç»SecurityManageræ¥å建Subjectï¼æä¾èº«ä»½ä¿¡æ¯ï¼ï¼
#### 9.shiroæ¦æªå¨çæ§è¡æµç¨
åºäºè¡¨åç»å½æ¦æªå¨
onPreHandleä¸»è¦æµç¨ï¼
1ï¼é¦å
夿æ¯å¦å·²ç»ç»å½è¿äºï¼å¦æå·²ç»ç»å½è¿äºç»§ç»æ¦æªå¨é¾å³å¯ï¼
2ï¼å¦ææ²¡æç»å½ï¼ççæ¯å¦æ¯ç»å½è¯·æ±ï¼å¦ææ¯getæ¹æ³çç»å½é¡µé¢è¯·æ±ï¼åç»§ç»æ¦æªå¨é¾ï¼å°è¯·æ±é¡µé¢ï¼ï¼å¦å妿æ¯getæ¹æ³çå
¶ä»é¡µé¢è¯·æ±åä¿åå½å请æ±å¹¶éå®åå°ç»å½é¡µé¢ï¼
3ï¼å¦ææ¯postæ¹æ³çç»å½é¡µé¢è¡¨åæäº¤è¯·æ±ï¼åæ¶éç¨æ·å/å¯ç ç»å½å³å¯ï¼å¦æå¤±è´¥äºä¿åéè¯¯æ¶æ¯å°âshiroLoginFailureâå¹¶è¿åå°ç»å½é¡µé¢ï¼
4ï¼å¦æç»å½æåäºï¼ä¸ä¹åæä¿åç请æ±ï¼åéå®åå°ä¹åçè¿ä¸ªè¯·æ±ï¼å¦åå°é»è®¤çæå页é¢ã
ä»»æè§è²æææ¦æªå¨
æµç¨ï¼
1ï¼é¦å
å¤æç¨æ·ææ²¡æä»»æè§è²ï¼å¦ææ²¡æè¿åfalseï¼å°å°onAccessDeniedè¿è¡å¤çï¼
2ï¼å¦æç¨æ·æ²¡æè§è²ï¼æ¥çå¤æç¨æ·ææ²¡æç»å½ï¼å¦ææ²¡æç»å½å
éå®åå°ç»å½ï¼
3ï¼å¦æç¨æ·æ²¡æè§è²ä¸è®¾ç½®äºæªææé¡µé¢ï¼unauthorizedUrlï¼ï¼é£ä¹éå®åå°æªææé¡µé¢ï¼å¦åç´æ¥è¿å401æªææé误ç ã
é»è®¤æ¦æªå¨
身份éªè¯ç¸å
³ç
authc åºäºè¡¨åçæ¦æªå¨ï¼å³éªè¯æåä¹åæè½è®¿é® /=authc
authcBasic Basic HTTP身份éªè¯æ¦æªå¨ï¼ä¸»è¦å±æ§ï¼applicationName
logout éåº /logout=logout
user ç¨æ·æ¦æªå¨ /=user
anon å¿åæ¦æªå¨ï¼ä¸è¬ç¨äºéæèµæºè¿æ»¤ /static/=anon
ææç¸å
³ç
roles è§è²æææ¦æªå¨ï¼ä¸»è¦å±æ§ï¼loginUrlï¼unauthorizedUrl /admin/=roles[admin]
perms æéæææ¦æªå¨ /user/=perms[âuser:createâ]
port ç«¯å£æ¦æªå¨ï¼ä¸»è¦å±æ§: port(80) /test=port[80]
rest rest飿 ¼æ¦æªå¨ /users=rest[user]ï¼ä¼èªå¨æ¼æ¥åºâuser:read,user:create,user:update,user:deleteâ
ssl sslæ¦æªå¨ï¼åªæè¯·æ±åè®®æ¯httpsæè½éè¿
#### 10.Session Manager ä¼è¯ç®¡çä»ç»ä¸ä¸
Session
æè°sessionï¼å³ç¨æ·è®¿é®åºç¨æ¶ä¿æçè¿æ¥å
³ç³»ï¼å¨å¤æ¬¡äº¤äºä¸åºç¨è½å¤è¯å«åºå½å访é®çç¨æ·æ¯è°ï¼ä¸å¯ä»¥å¨å¤æ¬¡äº¤äºä¸ä¿åä¸äºæ°æ®ã
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
session.getId(); // è·åå½åsessionçå¯ä¸æ è¯
session.getHost(); // è·åå½åSubjectç主æºå°åï¼è¯¥å°åæ¯éè¿HostAuthenticationToken.getHost()æä¾ç
session.getTimeOut(); // è·åè¶
æ¶æ¶é´
session.setTimeOut(); // 设置è¶
æ¶æ¶é´ï¼ä¸è®¾ç½®é»è®¤æ¯å
¨å±è¿ææ¶é´ï¼
session.touch(); // æ´æ°æåè®¿é®æ¶é´
session.stop(); // 鿝sessionï¼å½Subject.logout()æ¶ä¼èªå¨è°ç¨stopæ¹æ³æ¥éæ¯ä¼è¯ã妿å¨webä¸ï¼è°ç¨javax.servlet.http.HttpSession.invalidate()ä¹ä¼èªå¨è°ç¨shiro session.topæ¹æ³è¿è¡éæ¯shiroçä¼è¯
session.setAttribute(âkeyâ,â123â); // 设置session屿§
session.getAttribute(âkeyâ); // è·åsession屿§
session.removeAttribute(âkeyâ); // å é¤å±æ§
注ï¼Shiroæä¾çä¼è¯å¯ä»¥ç¨äºjavaSE/javaEEç¯å¢ï¼ä¸ä¾èµäºä»»ä½åºå±å®¹å¨ï¼å¯ä»¥ç¬ç«ä½¿ç¨ï¼æ¯å®æ´çä¼è¯æ¨¡åã
Session manager ä¼è¯ç®¡çå¨
ä¼è¯ç®¡çå¨ç®¡ççåºç¨ä¸ææSubjectçä¼è¯çå建ãç»´æ¤ãå é¤ã失æãéªè¯çå·¥ä½ãæ¯Shiroçæ ¸å¿ç»ä»¶ï¼é¡¶å±ç»ä»¶SecurityManagerç´æ¥ç»§æ¿äºSessionManagerï¼ä¸æä¾äºSessionSecurityManagerå®ç°ç´æ¥æä¼è¯ç®¡çå§æç»ç¸åºçSessionManagerãDefaultSecurityManageråDefaultWebSecurityManager é»è®¤SecurityManageré½ç»§æ¿äºSessionSecurityManagerã
Shiroæä¾äºä¸ä¸ªé»è®¤å®ç°ï¼
DefaultSessionManagerï¼DefaultSecurityManager使ç¨çé»è®¤å®ç°ï¼ç¨äºJavaSEç¯å¢ï¼
ServletContainerSessionManager: DefaultWebSecurityManager使ç¨çé»è®¤å®ç°ï¼ç¨äºWebç¯å¢ï¼å
¶ç´æ¥ä½¿ç¨Servlet容å¨çä¼è¯ï¼
DefaultWebSessionManagerï¼ç¨äºWebç¯å¢çå®ç°ï¼å¯ä»¥æ¿ä»£ServletContainerSessionManagerï¼èªå·±ç»´æ¤çä¼è¯ï¼ç´æ¥åºå¼äºServlet容å¨çä¼è¯ç®¡çã
#### åèèµæ
https://blog.csdn.net/qq_37254736/article/details/99350029
https://blog.csdn.net/pzq915981048/article/details/88971300