SpringBoot:集成Shiro之Shiro標(biāo)簽(.jsp和.ftl)


前言


上一篇博客,我們說(shuō)到如何在用戶請(qǐng)求的時(shí)候,攔截用戶請(qǐng)求進(jìn)行操作,這一篇博客我們來(lái)聊一下如何使用Shiro標(biāo)簽在網(wǎng)頁(yè)之中進(jìn)行用戶角色和權(quán)限控制.那么,我們就看一下具體的場(chǎng)景,假設(shè)頁(yè)面當(dāng)中有一個(gè)新增用戶按鈕,我們需要當(dāng)擁有admin角色的用戶登錄認(rèn)證完成之后顯示,普通用戶不顯示,那么這時(shí)候我們就需要使用Shiro標(biāo)簽來(lái)做處理了.例如這個(gè)例子,我們就可以用一下代碼來(lái)實(shí)現(xiàn).如果含有admin就會(huì)顯示,反之,則不會(huì)顯示.

<shiro:hashRole name = "admin">
    <button >新增用戶</button>
</shiro:hashRole>


JSP的Shiro標(biāo)簽


在JSP中使用Shiro標(biāo)簽比較簡(jiǎn)單,我們只需要注意用法即可.下面我就把所以Shiro標(biāo)簽放在下面了,各位看官自行查考.

<shiro:guest>
    游客訪問 <a href = "login.jsp"></a>
</shiro:guest>
 
user 標(biāo)簽:用戶已經(jīng)通過認(rèn)證\記住我 登錄后顯示響應(yīng)的內(nèi)容
<shiro:user>
    歡迎[<shiro:principal/>]登錄 <a href = "logout">退出</a>
</shiro:user>
 
authenticated標(biāo)簽:用戶身份驗(yàn)證通過沙热,即 Subjec.login 登錄成功 不是記住我登錄的
<shiro:authenticted>
    用戶[<shiro:principal/>] 已身份驗(yàn)證通過
</shiro:authenticted>
 
notAuthenticated標(biāo)簽:用戶未進(jìn)行身份驗(yàn)證,即沒有調(diào)用Subject.login進(jìn)行登錄,包括"記住我"也屬于未進(jìn)行身份驗(yàn)證
<shiro:notAuthenticated>
    未身份驗(yàn)證(包括"記住我")
</shiro:notAuthenticated>
 
 
principal 標(biāo)簽:顯示用戶身份信息,默認(rèn)調(diào)用
Subjec.getPrincipal()獲取,即Primary Principal
<shiro:principal property = "username"/>
 
hasRole標(biāo)簽:如果當(dāng)前Subject有角色將顯示body體內(nèi)的內(nèi)容
<shiro:hashRole name = "admin">
    用戶[<shiro:principal/>]擁有角色admin
</shiro:hashRole>
 
hasAnyRoles標(biāo)簽:如果Subject有任意一個(gè)角色(或的關(guān)系)將顯示body體里的內(nèi)容
<shiro:hasAnyRoles name = "admin,user">
    用戶[<shiro:pricipal/>]擁有角色admin 或者 user
</shiro:hasAnyRoles>
 
lacksRole:如果當(dāng)前 Subjec沒有角色將顯示body體內(nèi)的內(nèi)容
<shiro:lacksRole name = "admin">
    用戶[<shiro:pricipal/>]沒有角色admin
</shiro:lacksRole>
 
hashPermission:如果當(dāng)前Subject有權(quán)限將顯示body體內(nèi)容
<shiro:hashPermission name = "user:create">
    用戶[<shiro:pricipal/>] 擁有權(quán)限user:create
</shiro:hashPermission>
 
lacksPermission:如果當(dāng)前Subject沒有權(quán)限將顯示body體內(nèi)容
<shiro:lacksPermission name = "org:create">
    用戶[<shiro:pricipal/>] 沒有權(quán)限org:create
</shiro:lacksPermission>


Freemark的Shiro標(biāo)簽


在SpringBoot里面并不是直接支持JSP文件的,然后我就在項(xiàng)目中使用了Freemark,但是Shiro標(biāo)簽并不能直接支持.ftl文件,所以我們需要先引入一個(gè)Maven依賴.


<dependency>
    <groupId>net.mingsoft</groupId>
    <artifactId>shiro-freemarker-tags</artifactId>
    <version>0.1</version>
</dependency>

然后,我們寫一個(gè)名為ShiroTagsFreeMarkerCfg配置類來(lái)對(duì)Freemark使用Shiro標(biāo)簽進(jìn)行配置.當(dāng)然了,要確定配置類能被正確注入到Bean中,代碼如下所示.

import com.jagregory.shiro.freemarker.ShiroTags;
import freemarker.template.TemplateModelException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.annotation.PostConstruct;

@Component
public class ShiroTagsFreeMarkerCfg {

    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    @PostConstruct
    public void setSharedVariable() throws TemplateModelException {
        freeMarkerConfigurer.getConfiguration().setSharedVariable("shiro", new ShiroTags());
    }
}

配置類搞好之后,我們就可以在.ftl文件中使用Shiro的權(quán)限標(biāo)簽了,標(biāo)簽格式如下所示.

<@shiro.guest>  
游客訪問 <a href = "login.jsp"></a>
</@shiro.guest> 

user 標(biāo)簽:用戶已經(jīng)通過認(rèn)證\記住我 登錄后顯示響應(yīng)的內(nèi)容
<@shiro.user>  
歡迎[<@shiro.principal/>]登錄唯竹,<a href="/logout.html">退出</a>  
</@shiro.user>   

 authenticated標(biāo)簽:用戶身份驗(yàn)證通過呜魄,即 Subjec.login 登錄成功 不是記住我登錄的
<@shiro.authenticated>  
    用戶[<@shiro.principal/>]已身份驗(yàn)證通過  
</@shiro.authenticated>   
 
notAuthenticated標(biāo)簽:用戶未進(jìn)行身份驗(yàn)證力图,即沒有調(diào)用Subject.login進(jìn)行登錄,包括"記住我"也屬于未進(jìn)行身份驗(yàn)證
<@shiro.notAuthenticated>
    當(dāng)前身份未認(rèn)證(包括記住我登錄的)
</@shiro.notAuthenticated> 
 
 
principal 標(biāo)簽:顯示用戶身份信息洞斯,默認(rèn)調(diào)用
Subjec.getPrincipal()獲取,即Primary Principal
<@shiro.principal property="username"/>

 
hasRole標(biāo)簽:如果當(dāng)前Subject有角色將顯示body體內(nèi)的內(nèi)容
<@shiro.hasRole name="admin">  
    用戶[<@shiro.principal/>]擁有角色admin<br/>  
</@shiro.hasRole> 
 
hasAnyRoles標(biāo)簽:如果Subject有任意一個(gè)角色(或的關(guān)系)將顯示body體里的內(nèi)容
<@shiro.hasAnyRoles name="admin,user,member">  
用戶[<@shiro.principal/>]擁有角色admin或user或member<br/>  
</@shiro.hasAnyRoles>   
 
lacksRole:如果當(dāng)前 Subjec沒有角色將顯示body體內(nèi)的內(nèi)容
<@shiro.lacksRole name="admin">  
用戶[<@shiro.principal/>]不擁有admin角色
</@shiro.lacksRole>   
 
hashPermission:如果當(dāng)前Subject有權(quán)限將顯示body體內(nèi)容
<@shiro.hasPermission name="user:add">  
    用戶[<@shiro.principal/>]擁有user:add權(quán)限
</@shiro.hasPermission>   

lacksPermission:如果當(dāng)前Subject沒有權(quán)限將顯示body體內(nèi)容
<@shiro.lacksPermission name="user:add">  
    用戶[<@shiro.principal/>]不擁有user:add權(quán)限
</@shiro.lacksPermission> 


結(jié)語(yǔ)


寫到這里,前前后后寫了八篇Shiro集成博客,這個(gè)系列的博客到此就結(jié)束了,后期如果遇到新的問題會(huì)繼續(xù)補(bǔ)充,歡迎繼續(xù)關(guān)注騷棟.內(nèi)心騷棟,未忘初心.

參考博客

Demo傳送門


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔚约,一起剝皮案震驚了整個(gè)濱河市奄妨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苹祟,老刑警劉巖砸抛,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件评雌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锰悼,警方通過查閱死者的電腦和手機(jī)柳骄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門团赏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)箕般,“玉大人,你說(shuō)我怎么就攤上這事舔清∷坷铮” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵体谒,是天一觀的道長(zhǎng)杯聚。 經(jīng)常有香客問我,道長(zhǎng)抒痒,這世上最難降的妖魔是什么幌绍? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮故响,結(jié)果婚禮上傀广,老公的妹妹穿的比我還像新娘。我一直安慰自己彩届,他們只是感情好伪冰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著樟蠕,像睡著了一般贮聂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寨辩,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天吓懈,我揣著相機(jī)與錄音,去河邊找鬼靡狞。 笑死耻警,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耍攘。 我是一名探鬼主播榕栏,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蕾各!你這毒婦竟也來(lái)了扒磁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤式曲,失蹤者是張志新(化名)和其女友劉穎妨托,沒想到半個(gè)月后缸榛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兰伤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年内颗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敦腔。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡均澳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出符衔,到底是詐尸還是另有隱情找前,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布判族,位于F島的核電站躺盛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏形帮。R本人自食惡果不足惜槽惫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辩撑。 院中可真熱鬧界斜,春花似錦、人聲如沸槐臀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)水慨。三九已至得糜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晰洒,已是汗流浹背朝抖。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谍珊,地道東北人治宣。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像砌滞,于是被迫代替她去往敵國(guó)和親对雪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子派草,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容