springboot+shrio簡易登入登出和使用者許可權認證。
阿新 • • 發佈:2018-11-09
原始碼:https://github.com/huangshengz/myJavaDemo
本例子參考:https://www.cnblogs.com/HowieYuan/p/9259638.html
本例子驗證主要有兩個類,一個是自定義的攔截類ShiroConfig,在這裡我們自定義了很多需要的操作。
例如:角色許可權路徑,登入路徑等,一些具體的含義如下:
* anon:無參,開放許可權,可以理解為匿名使用者或遊客
* logout:無參,登出,執行後會直接跳轉到shiroFilterFactoryBean.setLoginUrl(); 設定的 url
* authc:無參,需要認證
* authcBasic:無參,表示 httpBasic 認證
* user:無參,表示必須存在使用者,當登入操作時不做檢查
* ssl:無參,表示安全的URL請求,協議為 https
* perms[user]:引數可寫多個,表示需要某個或某些許可權才能通過,多個引數時寫 perms["user, admin"],當有多個引數時必須每個引數都通過才算通過
* roles[admin]:引數可寫多個,表示是某個或某些角色才能通過,多個引數時寫 roles["admin,user"],當有多個引數時必須每個引數都通過才算通過
* rest[user]:根據請求的方法,相當於 perms[user:method],其中 method 為 post,get,delete 等
* port[8081]:當請求的URL埠不是8081時,跳轉到schemal://serverName:8081?queryString 其中 schmal 是協議 http 或 https 等等,
* serverName 是你訪問的 Host,8081 是 Port 埠,queryString 是你訪問的 URL 裡的 ? 後面的引數
第二個類是CustomRealm。它繼承了AuthorizingRealm類並且重寫了登入驗證和許可權驗證。在裡面我們可以自定義我們的業務邏輯。這個類非常重要,
因為在攔截類ShiroConfig裡,securityManager.setRealm(),就是把這個類注入進去,使得攔截能知道使用者資訊。
這個類doGetAuthenticationInfo 和 doGetAuthorizationInfo一定要區分明白,第一個是身份認證,例如登入時就是它,而第二個是角色許可權認證,
在裡面我們設定了角色許可權。
在登入方法裡,很明確的把使用者資訊放入到了UsernamePasswordToken裡,而doGetAuthenticationInfo進行身份認證時,使用者資訊就從UsernamePasswordToken取。
最後說一下整個流程:
1. 專案啟動時,Shiro攔截器工廠類ShiroConfig已經成功的注入。
2. 然後我們登入的時候,跳轉到login方法裡,資料會儲存到UsernamePasswordToken裡面,主要是使用者名稱和使用者密碼。
3. 然後就走到了CustomRealm類了的身份證方法doGetAuthenticationInfo,在這裡,我們根據使用者名稱從資料庫裡拿到了使用者密碼
與登入密碼做比較,然後判斷密碼是否正確,然後放行,到此使用者登入成功。
4. 然後使用者訪問資料的時候,會呼叫CustomRealm的doGetAuthorizationInfo進行許可權認證。