91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

shiro如何實(shí)現(xiàn)Web應(yīng)用認(rèn)證

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 14:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前面簡單介紹了shiro這個(gè)框架的一些基本知識,包括其架構(gòu)模型,主要的功能,關(guān)鍵名稱的含義,以及核心模塊和對應(yīng)的接口定義。

開始的話

今天我們從一個(gè)簡單示例,先了解使用shiro實(shí)現(xiàn)Web應(yīng)用認(rèn)證時(shí),一名開發(fā)者需要做些什么。同樣秉持著技術(shù)學(xué)習(xí)的原則,我們僅僅使用shiro框架以及一些其他簡化開發(fā)的工具庫,不會涉及到一些IOC容器,這樣在進(jìn)行模塊配置以及依賴關(guān)系梳理時(shí),通過手動的配置的方式,讓我們更加容易理解...

文章介紹

通過這篇文章,你可以有以下幾個(gè)方面的收獲:

  • 基于maven創(chuàng)建一個(gè)項(xiàng)目,養(yǎng)成項(xiàng)目依賴統(tǒng)一管理的習(xí)慣
  • 了解shiro在項(xiàng)目中的使用過程以及相關(guān)的配置
  • 了解如何實(shí)現(xiàn)通過shiro完成認(rèn)證以及授權(quán)
  • 了解shiro認(rèn)證流程
  • 對shiro從理論的認(rèn)識升華到基礎(chǔ)實(shí)踐
  • 獲得一個(gè)演示示例

示例實(shí)現(xiàn)

創(chuàng)建項(xiàng)目

1) 你可以選擇通過你的IDE快速創(chuàng)建一個(gè)項(xiàng)目,比如通過Intellij Idea,通過File->New->Project選擇Maven Archetype創(chuàng)建一個(gè)空項(xiàng)目,這里archetype可以選擇quickstart

圖片

這里你很可能遇到一個(gè)idea的bug,按上圖提交后,發(fā)現(xiàn)idea卡死了,項(xiàng)目創(chuàng)建失敗且無法打開,如果沒有就恭喜你了

2)最終我們會得到一個(gè)文件夾,里面包含一個(gè)pom.xml文件,結(jié)構(gòu)如下(如果有其他的內(nèi)容建議刪除,比如src,因?yàn)檫@個(gè)pom我們作為項(xiàng)目parent維護(hù))

圖片

添加依賴

細(xì)心的你會注意到,在根目錄下有個(gè)pom.xml,同時(shí)還有個(gè)ui-mvc目錄下也有個(gè)pom.xml文件,根目錄下的我一般習(xí)慣作為整個(gè)項(xiàng)目的父級依賴配置文件,用來管理所有依賴、插件版本以及屬性值,ui-mvc下的pom主要通過parent實(shí)現(xiàn)屬性繼承,這樣來實(shí)現(xiàn)配置集中化管理

./pom.xml

< project >
 //...
   < groupId >com.sucls.security< /groupId >
    < artifactId >auth-shiro< /artifactId >
    < version >1.0-SNAPSHOT< /version >
    < packaging >pom< /packaging >
    
    < properties >
     < project.build.sourceEncoding >UTF-8< /project.build.sourceEncoding >
     < maven.compiler.source >1.8< /maven.compiler.source >
     < maven.compiler.target >1.8< /maven.compiler.target >
     < shiro.version >1.9.1< /shiro.version >
     // ...
  < /properties >
    
 < dependencyManagement >
  < dependencies >
    < !-- 核心 -- >
    < dependency >
      < groupId >org.apache.shiro< /groupId >
      < artifactId >shiro-core< /artifactId >
      < version >${shiro.version}< /version >
    < /dependency >

    < dependency >
      < groupId >org.apache.shiro< /groupId >
      < artifactId >shiro-web< /artifactId >
      < version >${shiro.version}< /version >
    < /dependency >
    // ...
    < /dependencies >
 < /dependencyManagement >
   // ...
< /project >

./ui-mvc/pom.xml

< parent >
  < groupId >com.sucls.security< /groupId >
  < artifactId >auth-shiro< /artifactId >
  < version >1.0-SNAPSHOT< /version >
  < relativePath >../../pom.xml< /relativePath >
< /parent >
< artifactId >auth-shiro-ui-mvc< /artifactId >
< packaging >war< /packaging >
< name >ui-mvc< /name >

< dependencies >
  < !-- 核心 -- >
  < dependency >
    < groupId >org.apache.shiro< /groupId >
    < artifactId >shiro-core< /artifactId >
  < /dependency >
  < dependency >
    < groupId >org.apache.shiro< /groupId >
    < artifactId >shiro-web< /artifactId >
  < /dependency >
< /dependencies >

大部分內(nèi)容都省略了,可以參考文末源代碼,主要引入了shiro相關(guān)的依賴,以及一個(gè)提高開發(fā)效率的工具包

編寫shiro相關(guān)配置

我們所有代碼都會寫到ui-mvc模塊下,看到名稱就知道我們通過mvc的結(jié)構(gòu),因此前端是通過jsp這個(gè)老技術(shù),后面會講到如何通過前后端分離來實(shí)現(xiàn)認(rèn)證功能。

下面主要從以下幾個(gè)方面進(jìn)行配置:
web.xml以前說過,認(rèn)證基本都是基于Filter實(shí)現(xiàn),同樣shiro有一個(gè)核心的過濾器(該過濾器會將我們的配置解析成一個(gè)個(gè)過濾器鏈)

< filter >
 < filter-name >shiroFilter< /filter-name >
 < filter-class >org.apache.shiro.web.servlet.ShiroFilter< /filter-class >
< /filter >

< filter-mapping >
 < filter-name >shiroFilter< /filter-name >
 < url-pattern >/*< /url-pattern >
< /filter-mapping >

配置監(jiān)聽,在系統(tǒng)啟動時(shí)基于ServletContextListener調(diào)用初始化參數(shù)完成一些基本的系統(tǒng)初始化工作

< context-param >
 < param-name >shiroEnvironmentClass< /param-name >
 < param-value >org.apache.shiro.web.env.DefaultWebEnvironment< /param-value >
< /context-param >

< listener >
 < listener-class >com.sucls.security.security.SimpleEnvironmentLoaderListener< /listener-class >
< /listener >

這里通過自定義的監(jiān)聽,SimpleEnvironmentLoaderListener類承載了shiro基本上所有的配置,在這里我們會完整地構(gòu)建SecurityManager對象以及Filter的配置,如果讀過以前的文章你就會知道,SecurityManager主要的工作包括:

  • 代理實(shí)現(xiàn)用戶身份的認(rèn)證
  • 對API結(jié)果進(jìn)行緩存
  • 實(shí)現(xiàn)了用戶多種形式登錄(多Realm)
  • 實(shí)現(xiàn)用戶會話管理
  • 實(shí)現(xiàn)記住我功能
  • ...

ShiroFilter配置

FormAuthenticationFilter authcFilter = (FormAuthenticationFilter) filterChainResolver.getFilterChainManager().getFilters().get(DefaultFilter.authc.name());
        authcFilter.setLoginUrl("/login.jsp");
        authcFilter.setSuccessUrl("/index.html");

filterChainResolver.getFilterChainManager().addToChain("/webjars/**", DefaultFilter.anon.name());
filterChainResolver.getFilterChainManager().addToChain("/assets/**", DefaultFilter.anon.name());

filterChainResolver.getFilterChainManager().addToChain("/**", DefaultFilter.authc.name());

這里主要通過配置FilterChainResolver對象來完成ShiroFilter對象的構(gòu)建,后面講到源代碼時(shí)會細(xì)說。

SecurityManager配置

private void configureWebSecurityManager(DefaultWebSecurityManager securityManager) {
//
        securityManager.setAuthenticator(newAuthenticator());

        securityManager.setRealms(Arrays.asList(initRealm()));
    }

    private Authenticator newAuthenticator() {
        ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
        authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy()); // 至少一個(gè)Realm
        authenticator.setRealms(Arrays.asList(initRealm()) );
        return authenticator;
    }

 private Realm initRealm(){
        return RealmBuilder.create()
                .inMemoryRealm()                .user("admin").password("123456").role("ROLE_ADMIN").permissions(Arrays.asList("read","edit","create","delete"))
                .and()
                    .user("user").password("123456").role("ROLE_USER").permission("read")
                .build();
    }

這里僅根據(jù)需要配置了Realm以及認(rèn)證規(guī)則Authenticator

引入頁面

前端模板來源bootstrap quick,在此基礎(chǔ)上修改了遠(yuǎn)程資源(js、css)為本地引用,以及引入jsp文件頭對應(yīng)的配置

啟動項(xiàng)目

通過引入tomcat插件來啟動項(xiàng)目:

< plugin >
    < groupId >org.apache.tomcat.maven< /groupId >
    < artifactId >tomcat7-maven-plugin< /artifactId >
    < version >2.2< /version >
    < configuration >
        < port >8080< /port >
        < path >/< /path >
    < /configuration >
< /plugin >

這樣不需要我們單獨(dú)弄個(gè)tomcat,通過插件即可實(shí)現(xiàn)項(xiàng)目熱啟動,方便調(diào)試與靜態(tài)頁面的修改

圖片

執(zhí)行認(rèn)證

1)進(jìn)入系統(tǒng) http://localhost:8080/ 由于沒有登錄,跳轉(zhuǎn)到登錄頁http://localhost:8080/login.jsp

圖片

2)輸入用戶名密碼,按以上的配置admin/123456,登錄成功,進(jìn)入主頁

圖片

3)用戶鑒權(quán),上面可以看到admin配置了ROLE_ADMIN角色,user配置了ROLE_USER角色,所以

admin登錄時(shí):

訪問 http://localhost:8080/system/getProperties.json 正常返回?cái)?shù)據(jù) ;

訪問 http://localhost:8080/subject/getSubject.json 進(jìn)入未授權(quán)頁面

關(guān)于shiro鑒權(quán)部分主要是基于Filter以及AOP完成,其中請求交易基于Filter,在請求時(shí)基于登錄權(quán)限信息進(jìn)行交易攔截,而AOP則可以針對方法的調(diào)用階段,更加靈活和通用。具體的實(shí)現(xiàn)過程后面會細(xì)說,同時(shí)可以看到示例簡單的實(shí)現(xiàn)過程

示例分析

在整個(gè)示例中,回憶我們做了什么,有什么用?

  1. 引入shiro相關(guān)的依賴包,這點(diǎn)沒什么說的
  2. 配置web.xml的Filter以及Listener Listener則是基于Servlet的ServletContextListener規(guī)則,在web容器啟動后,調(diào)用contextInitialized方法完成容器初始化工作。這里的初始化包括:
  • 對SecurityManager的配置,后面我們會看到關(guān)于shiro的配置基本都是針對這個(gè)對象。包括Realm、多Realm認(rèn)證策略、RememberMe、SessionManager等等
  • 對FilterChainResolver的配置,目的是為了完善ShiroFilter對象,主要針對請求路徑對應(yīng)的過濾器,下面每一行都是一個(gè)根據(jù)請求路徑匹配的過濾器鏈,一段請求匹配,則進(jìn)入對應(yīng)過濾器鏈,所有注意配置順序
/assets/** = anon
/login = authc
/admin/** = roles[ROLE_ADMIN]
/admin/add* = perms[add:*]   //[action:type:instance]
/** = authc
  1. 引入靜態(tài)頁面,這里基于jsp實(shí)現(xiàn),當(dāng)然還有其他前端模板引擎可以使用,其中靜態(tài)資源通過引入webjars來加載
  2. 由于沒有引入springmvc,在資源映射(請求到頁面或交易)以及依賴管理、AOP裝配等等都是手動通過代碼完成,增加了代碼復(fù)雜度,但是結(jié)構(gòu)會更清晰,更容易理解

要知道,我們的目的是為SecurityManager注入屬性以及配置ShiroFilter過濾規(guī)則,并不一定需要基于ServletContextListener,這只是一個(gè)選擇,比如還可以在Filter的init方法中完成,只要保證系統(tǒng)啟動后對應(yīng)的配置加載或處理完成即可。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2837

    瀏覽量

    53300
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9523

    瀏覽量

    157060
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    531

    瀏覽量

    22970
  • Web應(yīng)用
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    3684
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    uClinux下動態(tài)Web技術(shù)的實(shí)現(xiàn)方法

    分析uClinux 操作系統(tǒng)的特點(diǎn), 實(shí)現(xiàn)uClinux 下的Boa Web Server; 討論如何通過編寫CGI 程序來最終實(shí)現(xiàn)uClinux 下的動態(tài)Web 頁面技術(shù)。
    發(fā)表于 04-15 11:10 ?17次下載

    基于網(wǎng)格環(huán)境實(shí)現(xiàn)WEB應(yīng)用編程研究

            本文分析了現(xiàn)存web 應(yīng)用系統(tǒng)存在的主要問題。提出了基于網(wǎng)格環(huán)境實(shí)現(xiàn)web 應(yīng)用的框架和模型。并對具體過程進(jìn)行了闡述。關(guān)鍵詞:
    發(fā)表于 09-05 09:12 ?5次下載

    uClinux下動態(tài)Web技術(shù)的實(shí)現(xiàn)方法

    摘要:介紹uClinux操作系統(tǒng)的御,實(shí)現(xiàn)uClinux下的Boa Web Server;討論如何通過編寫CGI程序來最終實(shí)現(xiàn)uClinux下的動態(tài)Web頁面技術(shù)。
    發(fā)表于 03-11 12:43 ?705次閱讀
    uClinux下動態(tài)<b class='flag-5'>Web</b>技術(shù)的<b class='flag-5'>實(shí)現(xiàn)</b>方法

    基于Linux的WEB服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

    基于Linux的WEB服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn) 嵌入式WEB服務(wù)器的主要設(shè)計(jì)思想就是將嵌入式系統(tǒng)和 WEB技術(shù)結(jié)合起來,將 WEB技術(shù)引入到現(xiàn)場
    發(fā)表于 10-06 08:30 ?3255次閱讀
    基于Linux的<b class='flag-5'>WEB</b>服務(wù)器的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    HTTP認(rèn)證及其在Web平臺中的實(shí)現(xiàn)

    一、前言 HTTP認(rèn)證Web服務(wù)器對客戶端的權(quán)限進(jìn)行認(rèn)證的一種方式,能夠?yàn)?b class='flag-5'>Web應(yīng)用提供一定程度的安全保障。目前一些Web應(yīng)用項(xiàng)目已經(jīng)提出
    發(fā)表于 05-03 16:27 ?27次下載

    基于Web的智能答疑系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)劉江平

    基于Web的智能答疑系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)_劉江平
    發(fā)表于 03-16 08:00 ?0次下載

    shiro簡單教程,環(huán)境搭建,權(quán)限控制,登陸驗(yàn)證

    shiro簡單教程,環(huán)境搭建,權(quán)限控制,登陸驗(yàn)證
    發(fā)表于 09-09 08:18 ?9次下載
    <b class='flag-5'>shiro</b>簡單教程,環(huán)境搭建,權(quán)限控制,登陸驗(yàn)證

    Apache Shiro框架的詳細(xì)資料說明

    自 2015 年 9 月 10 日以來,KyCore 項(xiàng)目中的用戶機(jī)制已被完整地替換為了以 Apache Shiro 框架為基礎(chǔ)建立的全新用戶機(jī)制,原有的用戶機(jī)制已基本上被全部刪除。更新以來,同事們
    發(fā)表于 03-08 08:00 ?4次下載
    Apache <b class='flag-5'>Shiro</b>框架的詳細(xì)資料說明

    如何一鍵實(shí)現(xiàn)openWRT的web認(rèn)證功能

    我們應(yīng)該了解了Lua語言在OpenWrt Web配置頁面的基本對應(yīng)功能設(shè)計(jì)方法。本文將以一個(gè)頁面為例, 來說明Lua 語言如何實(shí)現(xiàn)頁面控件以及怎么使輸入或操作的選項(xiàng)在系統(tǒng)中生效。
    發(fā)表于 12-31 11:12 ?15次下載
    如何一鍵<b class='flag-5'>實(shí)現(xiàn)</b>openWRT的<b class='flag-5'>web</b><b class='flag-5'>認(rèn)證</b>功能

    使用RESTful Web服務(wù)的過程

    本指南將引導(dǎo)您完成創(chuàng)建使用#spring# #spring認(rèn)證# RESTful Web 服務(wù)的應(yīng)用程序的過程。
    的頭像 發(fā)表于 09-06 15:47 ?1194次閱讀

    shiro綜合利用工具介紹

    shiro綜合利用工具:ShiroExp ? 工具介紹 shiro一把梭工具,該輪子主要有三大功能如下: 1、默認(rèn)密鑰爆破 利用SimplePrincipalCollection進(jìn)行檢測 利用
    的頭像 發(fā)表于 10-24 11:14 ?6550次閱讀

    再見了shiro

    在分布式項(xiàng)目里,比如電商項(xiàng)目,其實(shí)不太需要明確的權(quán)限劃分,說白了,我認(rèn)為沒必要做太麻煩的權(quán)限管理,一切從簡。何況shiro對于springCloud等各種分布式框架來說,簡直就是“災(zāi)難”。
    的頭像 發(fā)表于 01-15 11:32 ?1199次閱讀

    Shiro功能介紹

    記得做的第一個(gè)Web項(xiàng)目,系統(tǒng)認(rèn)證授權(quán)這塊就是基于Shiro實(shí)現(xiàn)的,當(dāng)時(shí)也是第一次接觸到這種類型的框架,同時(shí)是基于Spring做的集成,并且相關(guān)的配置都已經(jīng)是定制好的,只需要我們根據(jù)項(xiàng)
    的頭像 發(fā)表于 10-08 15:07 ?1083次閱讀
    <b class='flag-5'>Shiro</b>功能介紹

    基于Web的遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《基于Web的遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 10-18 09:53 ?0次下載
    基于<b class='flag-5'>Web</b>的遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)及<b class='flag-5'>實(shí)現(xiàn)</b>

    一個(gè)簡單的Shiro RCE檢測和利用腳本

    一個(gè)簡單的Shiro RCE檢測和利用腳本。
    的頭像 發(fā)表于 01-09 09:46 ?1468次閱讀