使用shiro保護(hù)你的springboot應(yīng)用

項(xiàng)目簡介

springboot中使用shiro大都是通過shiro-spring.jar進(jìn)行的整合的,雖然不是太復(fù)雜,但是也無法做到spring-boot-starter風(fēng)格的開箱即用。
項(xiàng)目中經(jīng)常用到的功能比如:驗(yàn)證碼很钓、密碼錯(cuò)誤次數(shù)限制苹享、賬號(hào)唯一用戶登陸公罕、動(dòng)態(tài)URL過濾規(guī)則身堡、無狀態(tài)鑒權(quán)等等们童,shiro還沒有直接提供支持侯养。
jsets-shiro-spring-boot-starter對(duì)這些常用的功能進(jìn)行了封裝和自動(dòng)導(dǎo)入敦跌,少量的配置就可以應(yīng)用在項(xiàng)目中。
1逛揩、項(xiàng)目地址:jsets-shiro-spring-boot-starter
2柠傍、使用說明:使用說明
3、示例應(yīng)用:jsets-shiro-demo
如果您對(duì)這個(gè)組件感興趣請(qǐng)star收藏辩稽,在使用這個(gè)組件中有任何問題或意見都可以在這里交流惧笛,歡迎提交代碼。

已完成功能

1搂誉、spring-boot-starter風(fēng)格的開箱即用徐紧。
2、區(qū)分ajax請(qǐng)求和普通請(qǐng)求炭懊,普通請(qǐng)求通過跳轉(zhuǎn)來響應(yīng)未登陸和未授權(quán)并级,AJAX請(qǐng)求通過狀態(tài)碼和消息響應(yīng)未登陸和未授權(quán)。
3侮腹、集成jcaptcha驗(yàn)證碼嘲碧。
4、密碼輸入錯(cuò)誤父阻,重試次數(shù)限制愈涩。
5望抽、賬號(hào)唯一用戶登陸,一個(gè)賬號(hào)只允許一個(gè)用戶登陸履婉。
6煤篙、與SpringCache無縫對(duì)接,支持guava毁腿、ehcache辑奈、redis等。
7已烤、提供認(rèn)證\授權(quán)緩存數(shù)據(jù)同步接口鸠窗,即時(shí)生效。
8胯究、支持動(dòng)態(tài)URL過濾規(guī)則稍计。
9、無狀態(tài)認(rèn)證授權(quán)支持裕循,共存有狀態(tài)和無狀態(tài)兩種鑒權(quán)方式臣嚣,無狀態(tài)鑒權(quán)支持JWT(JSON WEB TOKEN)、HMAC(哈希消息認(rèn)證碼)兩種協(xié)議剥哑。
10茧球、在線session管理,強(qiáng)制用戶下線功能星持。

后續(xù)計(jì)劃功能

1、cas單點(diǎn)登陸集成
2弹灭、oauth2.0支持

快速體驗(yàn)

1督暂、pom.xml中添加:

<dependency>
    <groupId>org.jsets</groupId>
    <artifactId>jsets-shiro-spring-boot-starter</artifactId>
    <version>0.0.1</version>
</dependency>

2、application.properties添加下面配置:

###jsets-shiro配置
#登陸頁面
jsets.shiro.login-url=/login
#登陸成功頁面
jsets.shiro.login-success-url=/index
#忽略攔截的URL,靜態(tài)資源
jsets.shiro.filte-rules[0]=/assets/**-->anon
#登陸
jsets.shiro.filte-rules[1]=/login/**-->authc
#退出
jsets.shiro.filte-rules[2]=/logout/**-->logout
#所有路徑穷吮,斷言session中存在用戶
jsets.shiro.filte-rules[3]=/**-->user

3逻翁、創(chuàng)建Controller類IndexAction.java:

@Controller
public class IndexAction {
    @RequestMapping("/")
    public String def() {
         return "index";
    }
    @RequestMapping("/index")
    public String index() {
         return "index";
    }
    @RequestMapping("/login")
    public String login() {
        return "login";
    }
}

4、創(chuàng)建登陸頁面login.html:

<form class="login-form" action="${ctx}/login" method="post">
    <div class="form-item">
    用戶名:<input type="text" name="username" />
    </div>
    <div class="form-item">
        密碼:<input type="password" name="password" />
    </div>
    <div class="form-item">
        <button type="submit">登錄</button>
    </div>
</form>
<!-- 認(rèn)證信息 -->
<font color="red">${Request["shiro_auth_message"]!}</font>

5捡鱼、創(chuàng)建主頁index.html:

<div class="body">
歡迎您:${Session.shiro_current_user.account!}
<br>
退出:<a href="${ctx}/logout">退了</a>
</div>

6八回、啟用jsets-shiro-spring-boot-starter:

@SpringBootApplication
@EnableJsetsShiro
public class Application{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

啟動(dòng)springboot應(yīng)用坯辩,控制臺(tái)會(huì)打印出組件預(yù)置的體驗(yàn)賬號(hào)和密碼:


控制臺(tái)體驗(yàn)賬號(hào)

使用這個(gè)賬號(hào)和密碼就可以登陸系統(tǒng)了不恭。

鑒權(quán)要素

鑒:認(rèn)證(Authentication)即證明您是賬號(hào)表示的那個(gè)人,基于form的認(rèn)證中使用口令(密碼)钉寝,rest api認(rèn)證中使用令牌(token)乍迄。
權(quán):權(quán)限驗(yàn)證(Authorization)即根據(jù)一個(gè)判斷規(guī)則來驗(yàn)證您是否能執(zhí)行一個(gè)操作管引。

認(rèn)證的過程需要賬號(hào)數(shù)據(jù),這個(gè)數(shù)據(jù)至少包含三個(gè)元素:賬號(hào)(用戶名)闯两、密碼褥伴、賬號(hào)是否可用谅将。
jsets-shiro-spring-boot-starter中使用Account接口表示賬號(hào)數(shù)據(jù)、使用ShiroAccountProvider接口為鑒權(quán)操作提供Account數(shù)據(jù)重慢,數(shù)據(jù)來源不限比如可以從數(shù)據(jù)庫饥臂、文件、LDAP似踱、遠(yuǎn)程服務(wù)等各種方式加載隅熙。

權(quán)限驗(yàn)證的過程需要權(quán)限數(shù)據(jù)和規(guī)則數(shù)據(jù),權(quán)限泛指能否操作資源屯援,角色是權(quán)限的集合猛们,如果使用權(quán)限來表示一個(gè)用戶能操作的資源顯然不方便,所以大部分系統(tǒng)的安全模型都是基于RBAC(Role-Based Access Control 基于角色的權(quán)限訪問控制)的狞洋。jsets-shiro-spring-boot-starter同樣使用ShiroAccountProvider接口為鑒權(quán)操作提供權(quán)限(角色)數(shù)據(jù)弯淘,數(shù)據(jù)來源不限。

具體參見"使用說明--接入用戶數(shù)據(jù)"一章吉懊。

規(guī)則數(shù)據(jù)庐橙,如果沒有規(guī)則就不存在判斷,權(quán)限驗(yàn)證也就無從談起借嗽,在shiro中規(guī)則表示成這樣:

article/update=roles[role_editor]
article/delete=roles[role_chief]
article/publish=roles[role_chief]

"article/update"就是操作的資源态鳖,"roles[role_editor]"是判斷標(biāo)準(zhǔn),表示用戶的角色列表中包含"role_editor"角色恶导,操作加上判斷標(biāo)準(zhǔn)就是規(guī)則浆竭。jsets-shiro-spring-boot-starter中您可以在application.properties中配置這樣的規(guī)則。也可以通過shiro的AOP方式配置規(guī)則惨寿,類似于這樣:

@RequiresRoles("role_editor")
public void update(Article article){
}

這兩種方式是有局限的邦泄,比如角色-資源的對(duì)應(yīng)關(guān)系發(fā)生變更,比如新增了一種角色裂垦,那就只能修改配置或者代碼然后重啟動(dòng)系統(tǒng)才能使得這些變更生效顺囊。實(shí)際開發(fā)中則更希望通數(shù)據(jù)庫查詢出角色-資源的對(duì)應(yīng)數(shù)據(jù),動(dòng)態(tài)生成URL規(guī)則蕉拢,當(dāng)角色-資源的對(duì)應(yīng)關(guān)系發(fā)生變更時(shí)能刷新并立即用戶這些規(guī)則特碳。

您可以通過ShiroFilteRulesProvider接口為鑒權(quán)操作提供規(guī)則數(shù)據(jù),并且支持實(shí)時(shí)刷新應(yīng)用這些規(guī)則晕换。

具體參見"使用說明--動(dòng)態(tài)URL過濾"一章午乓。

無狀態(tài)鑒權(quán)

無狀態(tài)(Stateless)鑒權(quán)通常應(yīng)用在微服務(wù)(REST API)架構(gòu)中,使用數(shù)字摘要(簽名)技術(shù)生成一個(gè)token作為認(rèn)證和授權(quán)的憑證闸准,整個(gè)認(rèn)證和授權(quán)過程不依賴于cookie或session硅瞧,服務(wù)端不保留客戶端狀態(tài)因此每次請(qǐng)求都要攜帶這個(gè)token。

jsets-shiro-spring-boot-starter提供兩種無狀態(tài)鑒權(quán)方式恕汇,分別是散列消息認(rèn)證碼(HMAC)腕唧、JSON WEB TOKEN(JWT)或辖。

HMAC適合端到端的鑒權(quán),即客戶端拿著簽名讓服務(wù)端進(jìn)行驗(yàn)簽枣接。
JWT適合客戶端詢問系統(tǒng)B是否有權(quán)訪問系統(tǒng)C和系統(tǒng)N如果有請(qǐng)開份憑證颂暇,然后拿著憑證讓系統(tǒng)C和系統(tǒng)N進(jìn)行驗(yàn)簽。

JWT是自包含的但惶,令牌中攜帶訪問主張(角色或權(quán)限)耳鸯,所以JWT鑒權(quán)不需要查詢數(shù)據(jù)。HMAC鑒權(quán)則需要查詢數(shù)據(jù)庫獲取角色或權(quán)限數(shù)據(jù)膀曾。HMAC和JWT鑒權(quán)過程均不產(chǎn)生session县爬。

如果您的系統(tǒng)即有狀態(tài)鑒權(quán)(即基于FORM的登陸認(rèn)證)又有無狀態(tài)鑒權(quán)(即提供rest接口),畢竟不是所有的系統(tǒng)都做了服務(wù)化拆分的添谊,默認(rèn)情況下HMAC也是使用ShiroAccountProvider接口為鑒權(quán)操作提供身份認(rèn)證和權(quán)限驗(yàn)證數(shù)據(jù)财喳,和有狀態(tài)鑒權(quán)公用一套數(shù)據(jù)。如您想拆分它們斩狱,即HMAC使用自己的鑒權(quán)數(shù)據(jù)耳高,可以使用ShiroStatelessAccountProvider為無狀態(tài)鑒權(quán)提供數(shù)據(jù)。

具體參見"使用說明--無狀態(tài)鑒權(quán)"一章所踊。

組件擴(kuò)展

JsetsShiroConfigurationAdapter是shiro配置的適配器泌枪,通過它您可以定制Realm、filter秕岛、SessionDAO碌燕、CacheManager等。

示例展示

jsets-shiro-demo是jsets-shiro-spring-boot-starter是應(yīng)用示例继薛,做的不是很精細(xì)陆蟆,主要為了演示功能實(shí)現(xiàn)。

主界面:


登陸成功情況

驗(yàn)證碼:


驗(yàn)證碼為空的情況

賬號(hào)或密碼錯(cuò)誤的情況

用戶被踢出:

當(dāng)前用戶被踢出

密碼輸入錯(cuò)誤重試次數(shù)限制:


重試錯(cuò)誤提示
錯(cuò)誤次數(shù)超限鎖定

角色列表:


角色列表

權(quán)限攔截:

權(quán)限不足

資源分配:

資源分配

權(quán)限驗(yàn)證通過:

角色驗(yàn)證成功

HMAC驗(yàn)簽通過:


hmac驗(yàn)簽成功

HMAC簽名失效:


簽名過期

HMAC簽名無效:


簽名無效

JWT權(quán)限驗(yàn)證失敗:


權(quán)限不足

JWT需要身份認(rèn)證:


未進(jìn)行身份認(rèn)證

在線用戶列表:


當(dāng)前在線用戶

強(qiáng)制用戶下線:


當(dāng)前用戶被管理員強(qiáng)制下線

更多功能和特性請(qǐng)參見jsets-shiro-spring-boot-starter源碼和使用說明惋增。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市改鲫,隨后出現(xiàn)的幾起案子诈皿,更是在濱河造成了極大的恐慌,老刑警劉巖像棘,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稽亏,死亡現(xiàn)場離奇詭異,居然都是意外死亡缕题,警方通過查閱死者的電腦和手機(jī)截歉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烟零,“玉大人瘪松,你說我怎么就攤上這事咸作。” “怎么了宵睦?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵记罚,是天一觀的道長。 經(jīng)常有香客問我壳嚎,道長桐智,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任烟馅,我火速辦了婚禮说庭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郑趁。我一直安慰自己刊驴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布穿撮。 她就那樣靜靜地躺著缺脉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悦穿。 梳的紋絲不亂的頭發(fā)上攻礼,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音栗柒,去河邊找鬼礁扮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞬沦,可吹牛的內(nèi)容都是我干的太伊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼逛钻,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼僚焦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曙痘,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤芳悲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后边坤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體名扛,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年茧痒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肮韧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弄企,靈堂內(nèi)的尸體忽然破棺而出超燃,到底是詐尸還是另有隱情,我是刑警寧澤桩蓉,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布淋纲,位于F島的核電站,受9級(jí)特大地震影響院究,放射性物質(zhì)發(fā)生泄漏洽瞬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一业汰、第九天 我趴在偏房一處隱蔽的房頂上張望伙窃。 院中可真熱鬧,春花似錦样漆、人聲如沸为障。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳍怨。三九已至,卻和暖如春跪妥,著一層夾襖步出監(jiān)牢的瞬間鞋喇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工眉撵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侦香,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓纽疟,卻偏偏與公主長得像罐韩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子污朽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345