Shiro 筆記

什么是 Shiro

官網(wǎng):http://shiro.apache.org/

是一款主流的 Java 安全框架柒室,不依賴任何容器,可以運(yùn)行在 Java SE 和 Java EE 項(xiàng)目中,它的主要作用是對(duì)訪問系統(tǒng)的用戶進(jìn)行身份認(rèn)證劝篷、授權(quán)、會(huì)話管理、加密等操作多律。

Shiro 就是用來解決安全管理的系統(tǒng)化框架。

Shiro 核心組件

用戶搂蜓、角色狼荞、權(quán)限

會(huì)給角色賦予權(quán)限,給用戶賦予角色

1洛勉、UsernamePasswordToken,Shiro 用來封裝用戶登錄信息如迟,使用用戶的登錄信息來創(chuàng)建令牌 Token收毫。

2、SecurityManager殷勘,Shiro 的核心部分此再,負(fù)責(zé)安全認(rèn)證和授權(quán)。

3玲销、Subject输拇,Shiro 的一個(gè)抽象概念,包含了用戶信息贤斜。

4策吠、Realm,開發(fā)者自定義的模塊瘩绒,根據(jù)項(xiàng)目的需求猴抹,驗(yàn)證和授權(quán)的邏輯全部寫在 Realm 中。

5锁荔、AuthenticationInfo蟀给,用戶的角色信息集合,認(rèn)證時(shí)使用。

6跋理、AuthorzationInfo择克,角色的權(quán)限信息集合,授權(quán)時(shí)使用前普。

7肚邢、DefaultWebSecurityManager,安全管理器汁政,開發(fā)者自定義的 Realm 需要注入到 DefaultWebSecurityManager 進(jìn)行管理才能生效道偷。

8、ShiroFilterFactoryBean记劈,過濾器工廠勺鸦,Shiro 的基本運(yùn)行機(jī)制是開發(fā)者定制規(guī)則,Shiro 去執(zhí)行目木,具體的執(zhí)行操作就是由 ShiroFilterFactoryBean 創(chuàng)建的一個(gè)個(gè) Filter 對(duì)象來完成换途。

Shiro 的運(yùn)行機(jī)制如下圖所示。

ShiroArchitecture.png

Spring Boot 整合 Shiro

1刽射、創(chuàng)建 Spring Boot 應(yīng)用军拟,集成 Shiro 及相關(guān)組件,pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.5.3</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.1.tmp</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

2誓禁、自定義 Shiro 過濾器

public class AccoutRealm extends AuthorizingRealm {

    @Autowired
    private AccountService accountService;

    /**
     * 授權(quán)
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }


    /**
     * 認(rèn)證
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        Account account = accountService.findByUsername(token.getUsername());
        if(account != null){
            return new SimpleAuthenticationInfo(account,account.getPassword(),getName());
        }
        return null;
    }
}

3懈息、配置類

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager);
        return factoryBean;
    }


    @Bean
    public DefaultWebSecurityManager securityManager(@Qualifier("accoutRealm") AccoutRealm accoutRealm){
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(accoutRealm);
        return manager;
    }

    @Bean
    public AccoutRealm accoutRealm(){
        return new AccoutRealm();
    }
}

編寫認(rèn)證和授權(quán)規(guī)則:

認(rèn)證過濾器

anon:無需認(rèn)證。

authc:必須認(rèn)證摹恰。

authcBasic:需要通過 HTTPBasic 認(rèn)證辫继。

user:不一定通過認(rèn)證,只要曾經(jīng)被 Shiro 記錄即可俗慈,比如:記住我姑宽。

授權(quán)過濾器

perms:必須擁有某個(gè)權(quán)限才能訪問。

role:必須擁有某個(gè)角色才能訪問闺阱。

port:請(qǐng)求的端口必須是指定值才可以炮车。

rest:請(qǐng)求必須基于 RESTful,POST酣溃、PUT瘦穆、GET、DELETE赊豌。

ssl:必須是安全的 URL 請(qǐng)求难审,協(xié)議 HTTPS。

創(chuàng)建 3 個(gè)頁面亿絮,main.html告喊、manage.html麸拄、administrator.html

訪問權(quán)限如下:

1、必須登錄才能訪問 main.html

2黔姜、當(dāng)前用戶必須擁有 manage 授權(quán)才能訪問 manage.html

3拢切、當(dāng)前用戶必須擁有 administrator 角色才能訪問 administrator.html

Shiro 整合 Thymeleaf

1、pom.xml 引入依賴

<dependency>
    <groupId>com.github.theborakompanioni</groupId>
    <artifactId>thymeleaf-extras-shiro</artifactId>
    <version>2.0.0</version>
</dependency>

2秆吵、配置類添加 ShiroDialect

@Bean
public ShiroDialect shiroDialect(){
    return new ShiroDialect();
}

3淮椰、index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="shortcut icon" href="#"/>
</head>
<body>
    <h1>index</h1>
    <div th:if="${session.account != null}">
        <span th:text="${session.account.username}+'歡迎回來!'"></span><a href="/logout">退出</a>
    </div>
    <a href="/main">main</a> <br/>
    <div shiro:hasPermission="manage">
        <a href="manage">manage</a> <br/>
    </div>
    <div shiro:hasRole="administrator">
        <a href="/administrator">administrator</a>
    </div>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纳寂,一起剝皮案震驚了整個(gè)濱河市主穗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毙芜,老刑警劉巖忽媒,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腋粥,居然都是意外死亡晦雨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門隘冲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闹瞧,“玉大人,你說我怎么就攤上這事展辞“掠剩” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵罗珍,是天一觀的道長洽腺。 經(jīng)常有香客問我,道長靡砌,這世上最難降的妖魔是什么已脓? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任珊楼,我火速辦了婚禮通殃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厕宗。我一直安慰自己画舌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布已慢。 她就那樣靜靜地躺著曲聂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佑惠。 梳的紋絲不亂的頭發(fā)上朋腋,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天齐疙,我揣著相機(jī)與錄音,去河邊找鬼旭咽。 笑死贞奋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穷绵。 我是一名探鬼主播轿塔,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仲墨!你這毒婦竟也來了勾缭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤目养,失蹤者是張志新(化名)和其女友劉穎俩由,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體混稽,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡采驻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匈勋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片礼旅。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洽洁,靈堂內(nèi)的尸體忽然破棺而出痘系,到底是詐尸還是另有隱情,我是刑警寧澤饿自,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布菇用,位于F島的核電站,受9級(jí)特大地震影響封拧,放射性物質(zhì)發(fā)生泄漏奕枢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一烛卧、第九天 我趴在偏房一處隱蔽的房頂上張望佛纫。 院中可真熱鬧,春花似錦总放、人聲如沸呈宇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甥啄。三九已至,卻和暖如春炬搭,著一層夾襖步出監(jiān)牢的瞬間蜈漓,已是汗流浹背穆桂。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留融虽,地道東北人充尉。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像衣形,于是被迫代替她去往敵國和親驼侠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354