shiro入門

ApacheShiro是一個(gè)功能強(qiáng)大且易于使用的Java安全框架必怜,提供了認(rèn)證,授權(quán)妆距,加密,和會(huì)話管理朴恳。

Shiro有三大核心組件:

Subject:即當(dāng)前用戶,在權(quán)限管理的應(yīng)用程序里往往需要知道誰能夠操作什么,誰擁有操作該程序的權(quán)利包雀,shiro中則需要通過Subject來提供基礎(chǔ)的當(dāng)前用戶信息憋他,Subject 不僅僅代表某個(gè)用戶孩饼,與當(dāng)前應(yīng)用交互的任何東西都是Subject,如網(wǎng)絡(luò)爬蟲等竹挡。所有的Subject都要綁定到SecurityManager上捣辆,與Subject的交互實(shí)際上是被轉(zhuǎn)換為與SecurityManager的交互。

SecurityManager:即所有Subject的管理者此迅,這是Shiro框架的核心組件,可以把他看做是一個(gè)Shiro框架的全局管理組件旧巾,用于調(diào)度各種Shiro框架的服務(wù)耸序。作用類似于SpringMVC中的DispatcherServlet,用于攔截所有請(qǐng)求并進(jìn)行處理鲁猩。

Realm:Realm是用戶的信息認(rèn)證器和用戶的權(quán)限人證器坎怪,我們需要自己來實(shí)現(xiàn)Realm來自定義的管理我們自己系統(tǒng)內(nèi)部的權(quán)限規(guī)則。SecurityManager要驗(yàn)證用戶廓握,需要從Realm中獲取用戶搅窿。可以把Realm看做是數(shù)據(jù)源隙券。

1男应、搭建測(cè)試工程

新建一個(gè)maven項(xiàng)目,簡單了解一下Shiro的API娱仔。

2沐飘、引入jar包

在pom.xml加上依賴

# 日志
<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
</dependency>
# shiro
 <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
</dependency>

如需配置日志打印,在resources文件夾新建log4j.properties文件牲迫,內(nèi)容為:

log4j.rootLogger=INFO, stdout, 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

3耐朴、編寫shiro配置文件:在resources文件夾下新建shiro.ini文件,文件內(nèi)容如下:

# 用戶
[users]
#賬號(hào)=密碼,角色1,角色2(角色可以無限多:用英文逗號(hào)隔開盹憎,用戶多個(gè)的話換行一樣的格式)
test=123456,role1,role2
# 角色
[roles]
#角色=權(quán)限1,權(quán)限2(權(quán)限可以無限多:用英文逗號(hào)隔開筛峭,角色多個(gè)的話換行一樣的格式)
role2=perm1
role1=perm1,perm2

4、測(cè)試代碼

public class ShiroTest {
    private static final transient Logger log =
            LoggerFactory.getLogger(ShiroTest.class);

    public static void main(String[] args){
        //1陪每、SecurityManager:classpath:shiro.ini
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        //2影晓、解析配置文件,并返回一些SecurityManager
        SecurityManager securityManager = factory.getInstance();

        //3奶稠、SecurityManager綁定給SecurityUtils
        SecurityUtils.setSecurityManager(securityManager);

        //4俯艰、安全操作,Subject是當(dāng)前登錄的用戶
        Subject currentUser = SecurityUtils.getSubject();

        //5锌订、測(cè)試在應(yīng)用的當(dāng)前回話中設(shè)置屬性
        Session session = currentUser.getSession();

        //如果用戶沒有登陸過
        if(!currentUser.isAuthenticated()){
            UsernamePasswordToken token = new UsernamePasswordToken("test","123456");
            //記住我
            token.setRememberMe(true);
            try{
                currentUser.login(token);
                log.info("用戶【"+currentUser.getPrincipal()+"】 登錄成功");
                //登錄之后查看是否擁有指定角色
                if(currentUser.hasRole("admin")){
                    log.info("有admin角色");
                }else{
                    log.info("沒有admin角色");
                }
                if(currentUser.hasRole("role1")){
                    log.info("有role1角色");
                }else{
                    log.info("沒有role1角色");
                }
                //查看用戶是否擁有某個(gè)權(quán)限
                if(currentUser.isPermitted("perm1")){
                    log.info("有perm1權(quán)限");
                }else{
                    log.info("沒有perm1權(quán)限");
                }
                if(currentUser.isPermitted("guest")){
                    log.info("有g(shù)uest權(quán)限");
                }else{
                    log.info("沒有g(shù)uest權(quán)限");
                }
                //登出
                currentUser.logout();
            }catch (UnknownAccountException uae){
                log.info(token.getPrincipal()+" 賬戶不存在");
            }catch (IncorrectCredentialsException ice){
                log.info(token.getPrincipal()+" 密碼不正確");
            }catch (LockedAccountException lae){
                log.info(token.getPrincipal()+" 用戶被鎖定了 ");
            }catch (AuthenticationException ae){
                //無法判斷是什么錯(cuò)
                log.info(ae.getMessage());
            }
        }
    }
}

注:rememberMe只能記住你登錄過竹握,但不會(huì)記住你的權(quán)限信息。

小技巧
在我們開發(fā)的過程中辆飘,我們經(jīng)常會(huì)遇到修改一點(diǎn)點(diǎn)東西時(shí)候啦辐,都需要重啟操作來生效谓传。因此,spring boot為我們提供了一個(gè)devTool熱更新工具芹关,無需重啟即可生效

pom.xml中引入相關(guān)jar

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<properties>
    <java.version>1.8</java.version>
   <project.build.sourceEncoding>UTF8</project.build.sourceEncoding>  
<project.reporting.outputEncoding>UTF8</project.reporting.outputEncoding>
</properties>
<dependencies>
 ... 
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
  </dependency>
...
<dependencies>

如何使用
【提示】: 由于我自己使用的是idea進(jìn)行開發(fā),因此對(duì)eclipse的引入是否需要快捷鍵并不是很清楚续挟,提供了相關(guān)鏈接

IDEA使用:

  • 修改了java類的地方,使用Ctrl+Shift+F9進(jìn)行熱更新
  • 靜態(tài)頁面/模板頁面侥衬,使用Ctrl+F9進(jìn)行熱更新
  • 快捷鍵使用后不生效诗祸?前往File-Settings-Compiler-Build Project automatically選項(xiàng)開始idea自動(dòng)編譯

eclipse使用:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轴总,一起剝皮案震驚了整個(gè)濱河市直颅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怀樟,老刑警劉巖功偿,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異往堡,居然都是意外死亡械荷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門虑灰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吨瞎,“玉大人,你說我怎么就攤上這事瘩缆」鼐埽” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵庸娱,是天一觀的道長着绊。 經(jīng)常有香客問我,道長熟尉,這世上最難降的妖魔是什么归露? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮斤儿,結(jié)果婚禮上剧包,老公的妹妹穿的比我還像新娘。我一直安慰自己往果,他們只是感情好疆液,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陕贮,像睡著了一般堕油。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天掉缺,我揣著相機(jī)與錄音卜录,去河邊找鬼。 笑死眶明,一個(gè)胖子當(dāng)著我的面吹牛艰毒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搜囱,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丑瞧,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蜀肘?” 一聲冷哼從身側(cè)響起嗦篱,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幌缝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诫欠,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涵卵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荒叼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿偎。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖被廓,靈堂內(nèi)的尸體忽然破棺而出坏晦,到底是詐尸還是另有隱情,我是刑警寧澤嫁乘,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布昆婿,位于F島的核電站,受9級(jí)特大地震影響蜓斧,放射性物質(zhì)發(fā)生泄漏仓蛆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一挎春、第九天 我趴在偏房一處隱蔽的房頂上張望看疙。 院中可真熱鬧,春花似錦直奋、人聲如沸能庆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搁胆。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丰涉,已是汗流浹背拓巧。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留一死,地道東北人肛度。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像投慈,于是被迫代替她去往敵國和親承耿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359