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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

shiro如何實現(xiàn)Web應用認證

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-08 14:53 ? 次閱讀

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

開始的話

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

文章介紹

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

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

示例實現(xiàn)

創(chuàng)建項目

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

圖片

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

2)最終我們會得到一個文件夾,里面包含一個pom.xml文件,結構如下(如果有其他的內容建議刪除,比如src,因為這個pom我們作為項目parent維護)

圖片

添加依賴

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

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

編寫shiro相關配置

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

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

< 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)啟動時基于ServletContextListener調用初始化參數(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基本上所有的配置,在這里我們會完整地構建SecurityManager對象以及Filter的配置,如果讀過以前的文章你就會知道,SecurityManager主要的工作包括:

  • 代理實現(xiàn)用戶身份的認證
  • 對API結果進行緩存
  • 實現(xiàn)了用戶多種形式登錄(多Realm)
  • 實現(xiàn)用戶會話管理
  • 實現(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對象的構建,后面講到源代碼時會細說。

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()); // 至少一個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以及認證規(guī)則Authenticator

引入頁面

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

啟動項目

通過引入tomcat插件來啟動項目:

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

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

圖片

執(zhí)行認證

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

圖片

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

圖片

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

admin登錄時:

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

訪問 http://localhost:8080/subject/getSubject.json 進入未授權頁面

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

示例分析

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

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

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

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

    關注

    7

    文章

    2613

    瀏覽量

    47010
  • 接口
    +關注

    關注

    33

    文章

    8257

    瀏覽量

    149950
  • 容器
    +關注

    關注

    0

    文章

    490

    瀏覽量

    21986
  • Web應用
    +關注

    關注

    0

    文章

    16

    瀏覽量

    3462
收藏 人收藏

    評論

    相關推薦

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

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

    基于網格環(huán)境實現(xiàn)WEB應用編程研究

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

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

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

    基于Linux的WEB服務器的設計與實現(xiàn)

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

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

    一、前言 HTTP認證Web服務器對客戶端的權限進行認證的一種方式,能夠為Web應用提供一定程度的安全保障。目前一些Web應用項目已經提出
    發(fā)表于 05-03 16:27 ?27次下載

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

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

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

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

    Apache Shiro框架的詳細資料說明

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

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

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

    使用RESTful Web服務的過程

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

    shiro綜合利用工具介紹

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

    再見了shiro

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

    Shiro功能介紹

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

    基于Web的遠程監(jiān)控系統(tǒng)設計及實現(xiàn)

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

    一個簡單的Shiro RCE檢測和利用腳本

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