javaEE開發必用的技術 ssm框架+shiro框架實現權限控制及認證

2020-12-20 很神很奇很神奇

本文將使用spring,springmvc,mybatis,shiro都是最新版本的框架+JDK1.8完成用戶登錄模塊的DEMO,該DEMO具備較完善的功能,大部分項目都要做權限控制,大部分項目的思路都可以用來參照。本文使用shiro框架來完成認證和授權,同功能的框架還有一種叫做spring security,spring保安的框架,他倆的區別就是一個是Apache旗下的一個是Spring旗下的,具體哪個好你們可以自己去體驗體驗。

shiro是基於過濾器完成權限控制的,所以我們要在web.xml中給shiro配置一個專屬過濾器。

但是這個過濾器是spring提供的,spring通過代理調用 shiro的過濾器,使用spring security框架時,也得這樣配置。url-pattern為/*匹配所有請求,都走這個過濾器。下面我們看一下shiro在spring的配置文件中applicationContext.xml的配置。

這裡需要配置一個bean,此bean的名字必須與web.xml的filter-name相同,spring代理時就是通過<filter-name>shiroFilter</filter-name>找到代理對象的,如果不配置就會拋出error,create bean shiroFilter Class not found 的異常,所以我們需要將shiro的過濾器註冊到spring容器中給spring代理。這裡註冊的是org.apache.shiro.spring.web.ShiroFilterFactoryBean工廠類bean,shiro用的過濾器都是由這個工廠創建,其中有shiro自帶的過濾器,也可以加入自定義的過濾器。我們使用shiro的登錄校驗時就用到了shiro的authc過濾器。該過濾器功能就是檢查session中是否擁有shiro的授權,如果沒有的話就要跳轉到我們上訪在property配置的unauthorizedUrl路徑。

我們註冊完shiroFilter bean之後還需要為其中屬性進行注入,有三個url,一個是登錄用的url,校驗成功url和校驗失敗url。另一個就是securityManager,不要在創建一個SecurityManager bean注入到spring容器中,由於這是一個接口,在啟動spring時會拋出異常,我們需要在class位置填寫他的實現類DefaultWebSecurityManager。那麼他的作用是什麼呢,有點類似dispatcherServlet它是核心方法的調用者,在shiro中處於一種指揮中心似的地位。所以我們需要使用的一些功能都是經由SecurityManager一手操辦的,也是ShiroFilterFactoryBean依賴它的一個原因。然後我們需要配置一個filterChainDefinitions對過濾器鏈的定義。shiro底層是將所有的過濾器封裝到一個linkedHashMap裡面的,我們的url在訪問伺服器時,先經過這個過濾器鏈再到攔截器,最後才到servlet,filterChainDefinitions其實也是一個map,他會根據我們寫的url 來取到過濾器鏈中的相應過濾器來執行。就是說如果寫不同的url-pattern那麼經過的shiro內部過濾器時不同的。shiro的過濾器有以下幾種

anon 這種字母是過濾器的名字縮寫,shiro可以識別,以下就用字母來指代過濾器。anon的功能是一個空的過濾器,它的作用是對靜態資源文件進行放行,比如圖片文件,js,css等都需要使用anon過濾器,也包括登錄頁面,等一些特殊的url,都是可以直接進行訪問。authc 該過濾器會檢查訪問url的session中是否擁有shiro的授權,如果沒有則跳轉至上面配置的校驗失敗頁面。幾乎除了幾個特殊頁面外,所有的url都需要經過這個過濾器,shiro會在用戶登錄成功之後進行授權,所以需要登錄之後才能訪問的url都要經過這個過濾器。roles 是一種角色管理過濾器,它能夠對用戶登錄的帳號的種類進行過濾。被roles匹配的url需要特定的用戶帳號才可以訪問,比如管理員的帳號和普通用戶的帳號是不一樣的。perms 是一種權限過濾器,它對用戶權限進行過濾,它屬於進一步的劃分,並不是所有roles級別都有某個權限。

等等。沒有使用shiro的時候我們都是在login方法中查詢資料庫,那麼看看在使用shiro之後login方法該怎麼寫。一個成熟的項目的登錄頁面現在已經有簡訊登錄,驗證碼登錄以及人臉識別登錄了。這裡使用一種古老的技術用戶名密碼+字母數字組合驗證碼登錄。先看登錄頁面

背景圖片很精美,是我從1688登錄頁下載下來的,看關鍵信息。需要用input提交的有三條數據,用戶名密碼驗證碼和一個登錄submit按鈕。這裡的驗證碼是一個jsp頁面,並不是ajax每隔一段時間刷新那種,也是個非常low的驗證碼。也就是說每次登錄按鈕按下是我們實際提交四條數據,除了頁面上的圖形驗證還有jsp頁面的驗證碼,jsp頁面驗證碼存在session裡。下面看java代碼

該代碼中我們需要做幾件事情:

參數接收 用戶名和密碼使用實體類TUser接收參數接收 手寫驗證碼從Session中拿出jsp頁面的驗證碼

接下來需要對驗證碼做幾個判斷,非空,不是null和不等於空串。如果if為false則重定向至登錄頁面並提示原因。下一步驗證驗證碼輸入是否正確,如果為false重定向並提示。接下來通過SecurityUtils.getSubject()獲取一個單例的Subject對象,該對象用於綁定本地線程,每個用戶訪問時起一條線程,綁定的就是這個線程,

它是一個自己寫的Thread域,那我們拿到的subject對象就是該域的引用。下面實例化UsernamePasswordToken對象,Subject和UsernamePasswordToken都是由shiro提供的。該token需要傳入用戶提交過來的用戶名和密碼,按上圖參數傳入即可。到這裡就結束了,寫shiro的人還是非常騷氣的.之前的文章裡面我們不是配置了全局異常處理器嗎

s.login(token);方法驗證成功與否需要根據異常判斷,你可以自己trycatch也可以使用springmvc提供的異常處理器來處理。下面我們看看它是怎麼進行用戶名密碼進行校驗的。首先需要在spring的主配置文件中添加如下配置

紅框圈出來的bean是shiro提供的securityManager,他需要注入一個realm。realm是什麼呢,realm就是我們自己編寫的實現用戶名密碼驗證方法的類,他還包含了授權功能。粉色箭頭指向的就是realm的bean,該類由我們自己編寫,稍後見下圖。紅色箭頭是spring提供的通過註解進行代理的類,他需要注入一條屬性,proxyTargetClass是選擇目標代理,如果為true則底層使用cglib代理,如果不配置或者為false,默認為false時,使用JDK代理。JDK除了需要實現接口外,接口中必須封裝子類所有方法,否則會出現異常。因為JDK代理使用的接口中的方法,JAVA8的default關鍵字已經彌補了JDK代理部分缺陷,所有這裡推薦配置為true,使用false也不是不行!最後一個黑色箭頭是shiro提供的切面類,通知由shiro已經編寫完畢,切入點需要我們自行配置。繼續上面添加完realm後我們需要編寫realm中的代碼,realm類必須繼承shiro提供的AuthorizingRealm抽象類,

這個類實現了很多接口,留給我們自己編寫的就兩個方法

doGetAuthorizationInfodoGetAuthenticationInfo

他們兩個長得很像,但是可以看到中間為za的授權方法,為ca的是認證方法。下面我們就先來編寫認證方法

認證方法提供我們一個參數,token就是我們剛才傳入用戶提交的用戶名和密碼的token,需要將其轉型成子類UsernamePasswordToken,然後獲取用戶名。下面要做的就是簡單了,因為我使用的是mybatis,所以直接查資料庫,通過token中的用戶名查詢密碼。select * from user where username = ? 發送一個這樣語句拿到資料庫中的密碼,如果查詢不到對應密碼就會拋出異常AuthenticationException,這裡使用的是shiro1.4版本,如果是1.2或以下版本異常名可能不同。然後我們創建一個SimpleAuthenticationInfo對象,它相當於一個密碼校驗器,需要傳入三個參數,第一個剛才通過username查詢到得實體類對象,查詢到得密碼,如果你的密碼在資料庫中使用加密算法過的話需要將用戶提交進來的密碼也進行加密。第三個參數就是對象名。最後返回SimpleAuthenticationInfo對象,它裡面裝的是幾個boolean類型的值,用來表示密碼驗證是否與用戶提交進來的密碼一致,如果不一致會拋出IncorrectCredentialsException異常。我們通過對異常進行捕獲就能得出是否存在用戶名和密碼是否正確。到此認證方法就結束了,認證通過後將不受到authc過濾器的限制。下面是shiro的授權方法

為了便於演示做了部分改動,perms過濾器是一種權限過濾器,要求訪問該url時必須攜帶後面[]中的權限,它是一個元素為字符串的數組,所以一個url可以配置多種權限。要想使用權限我們需要在資料庫中使用三張表。用戶表、權限表、角色表。我們需要在realm中將這三張表連接起來,可以在資料庫中創建兩個中間表也可以在sql中添加創建臨時表。

下圖為權限表

。下圖角色表

最後是用戶表

他們的關係就是從用戶表開始,用戶表對角色表一對多。角色表對權限表是多對多的關係。下面我們為代碼添加權限.添加權限有四種方式

第一種就是之前圖中的 /editItem = perms["editItem"] 對url訪問權限進行控制,如果沒有該權限則不能訪問url。第二種如圖所示通過註解實現的,

在方法上添加註解,沒有itemList權限的用戶將無法訪問itemList頁面。

第三種為shiro標籤,被標籤包裹住的html代碼將不會顯示

第四種幾乎不會使用所以不需要了解。

添加完權限後我們直接在realm類中完成對用戶授權。

記住授權方法就是中間是za的,我們先實例化SimpleAuthorizationInfo對象,它是用戶權限的容器。然後通過本地線程棧綁定對象SecurityUtils.getSubject().getPrincipal()可以拿到我們剛才從資料庫用過用戶名查詢到得Tuser對象。存到shiro自己寫的ThreadContext域裡去了,現在把它拿出來。接下來通過u.id查詢該用戶擁有的權限。通過

SELECT * FROM auth_function af

LEFT JOIN role_function rf ON rf.function_id = af.id

LEFT JOIN auth_role ar ON ar.id = rf.role_id

LEFT JOIN user_role ur ON rf.role_id = ur.role_id

LEFT JOIN t_user t ON ur.user_id = t.id

WHERE t.id = #{id};

查詢到用戶對應的權限對象集合。然後對集合進行遍歷,沒一個遍歷調用SimpleAuthorizationInfo對象info的add方法將權限對象中的權限添加進去,這裡所謂的權限可以是字母也可以是數字,它是一種標識。添加完成後結束。認證和授權方法都結束以後

這個位置才結束。下一步就是進行跳轉。那麼我們到頁面中看看shiro到底做了什麼

這是沒輸入驗證碼返回該信息,該信息是應該顯示在登錄框內的,我沒寫那個。

密碼不正確時,返回的異常。

用戶名不正確的異常。

沒有登錄權限時返回的信息。以上就是shiro權限和認證的演示了,它支持的功能比較多,還支持緩存用戶權限角色信息等,它的realm也有自己專屬的JDBC,從框架的源碼風格來看spring屬於偏官方的比較通俗易懂的,shiro則是怎麼讓你看不懂怎麼寫。感興趣的小夥伴們可以去看一看我前面的文章.不懂得地方在下面留言回復即可,框架基礎在前面文章都講過了。最後補充一下,本文編譯為spring系列是5.系的版本,shiro系列必須用1.4系版本,其他會造成jar衝突。

相關焦點

  • Shiro權限管理框架入門到實戰
    ,這幾天又接著學習shiro框架,這兩者框架都是同一類產品,解決同一類問題,但是在官方推薦使用Shiro框架,因為它簡單易學,所以這裡有時間學習了以下。Shiro的作用用戶訪問權限控制和登陸的認證,1.用於用戶登陸的驗證,2.用戶用戶登錄後的授權,也就是那些用戶擁有訪問那些接口的權限可以響應認證、訪問控制,或者 Session 生命周期中發生的事件可將一個或以上用戶安全數據源數據組合成一個複合的用戶「view」(視圖)支持提供「Remember Me」服務,當用戶第二次登陸時只要session還可用就不需要再次登陸Shiro的優點靈活——Apache
  • Java 程式設計師如何使用 Shiro 框架
    因此Realm是整個框架中為數不多的必須由設計者自行實現的模塊,當然Shiro提供了多種實現的途徑,本文只介紹最常見也最重要的一種實現方式——資料庫查詢。4、兩條重要的英文我在學習Shiro的過程中遇到的第一個障礙就是這兩個對象的英文名稱:AuthorizationInfo,AuthenticationInfo。
  • Apache Shiro 1.2.3 發布,權限控制框架
    Apache Shiro 1.2.3 發布了,Shiro 是一個權限控制框架,因其簡單而又不失強大的特點引起了不少開發者的注意。
  • Shiro入門這篇就夠了【Shiro的基礎知識、回顧URL攔截】
    只要有用戶參與的系統一般都要有權限管理,權限管理實現對用戶訪問系統的控制,按照安全規則或者安全策略控制用戶可以訪問而且只能訪問自己被授權的資源。張三隻能查看行政部 的用戶信息,李四隻能查看開發部門的用戶信息。細粒度權限管理就是數據級別的權限管理。2.1如何實現粗粒度權限管理?粗粒度權限管理比較容易將權限管理的代碼抽取出來在系統架構級別統一處理。比如:通過springmvc的攔截器實現授權。
  • java快速開發框架工作流程引擎比較
    為了快速高效地開發出WEB應用系統,我們一般都會選擇某些合適的快速開發框架,將對項目的效率至關重要。而java多用於企業應用。越來越多的企業和開發人員選擇java為了更好地幫助大家找到適合自己快速開發框架流程引擎, 快速地完成工作流引擎技術架構選型, 快速地完成項目交付。
  • 30 分鐘學會如何使用 Shiro
    因此Realm是整個框架中為數不多的必須由設計者自行實現的模塊,當然Shiro提供了多種實現的途徑,本文只介紹最常見也最重要的一種實現方式——資料庫查詢。我在學習Shiro的過程中遇到的第一個障礙就是這兩個對象的英文名稱:AuthorizationInfo,AuthenticationInfo。不用懷疑自己的眼睛,它們確實長的很像,不但長的像,就連意思都十分近似。
  • springboot整合shiro 框架
    所以自己整合了一個比較簡單的shiro的使用方法,shiro是什麼、怎麼用就不用我在這裡詳細的講解了。AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; }}這個配置文件是我們進行權限和登入認證的時候需要用到的
  • UWebJava 後臺開發框架
    UWeb框架中集成了權限管理框架專注於為中小企業提供最佳的行業基礎後臺框架解決方案,執行效率、擴展性、穩定性值得信賴,操作體驗流暢,使用非常優化,歡迎大家使用及進行二次開發。項目介紹1、模塊化:全新的架構和模塊化的開發機制,便於靈活擴展和二次開發。
  • SSM框架-SpringMVC詳解
    springmvc概述Springmvc是spring框架的一個模塊,spring和springmvc無需中間整合層整合。Springmvc是一個基於mvc的web框架表現層的三大任務:URL到controller的映射http請求參數綁定http響應的生成和輸出MVC設計模式
  • 最受歡迎的 Java Web 開發框架盤點
    Java開發框架排名列前3名,包括以下: 1) Spring網址:http://projects.spring.io/spring-framework/ 2) JSF網址:http://www.oracle.com/technetwork/java/javaee/download-139288
  • Java SSM框架相關基礎面試題整理
    一、Spring面試題1、Spring 在ssm中起什麼作用?
  • YuebonCore 快速開發框架支持 .Net 5.0
    YuebonCore基於.Net5.0的權限管理及快速開發框架,前後端分離,核心模塊包括:組織機構、角色用戶、權限授權、多系統、多應用管理、定時任務、業務單據編碼規則、代碼生成器等,整合應用最新技術包括Asp.NetCore MVC、EF、Dapper、AutoFac、WebAPI、Swagger、Vue等。它的架構易於擴展,是中小企業的首選。
  • renren-security v2.0.0 發布,輕量級權限管理系統
    具有如下特點輕量級的權限系統,只涉及Spring、Shiro、Mybatis後端框架,降低學習使用成本友好的代碼結構及注釋,便於閱讀及二次開發支持HTML、JSP、Velocity、Freemarker等視圖,零技術門檻完善的代碼生成機制,可在線生成entity
  • ABP開發框架前後端開發系列---(1)框架的總體介紹
    初次了解ABP框架,對它還是非常驚豔的,它基本上是.NET 領域架構的集大成者,幾乎囊括了我們.NET領域排的上名的各種技術應用,而且它本身可以支持.net framework和.net core兩種技術流派,對它的介紹也是非常感興趣。1)ABP框架的特點我們來大概了解下ABP框架涉及到的內容。
  • ...TP6 的多租戶多應用多端快速開發框架 - OSCHINA - 中文開源...
    開源說明介紹「bwsaas多端SAAS平臺運營系統」接入微信開放平臺(第三方服務商),微信公眾號管理及微信小程序一鍵授權發布,具備多租戶管理、多應用上架購買、多終端(公眾號,H5,小程序,PC,APP)可接入、強大的權限節點控制(管理員權限,租戶及租戶應用權限)、 強大的一鍵CRUD生成代碼(頁面JS,控制器controller,模型及關聯模型model)、基於ThinkPHP6及layui
  • NutzWk 5.2.6 發布,Java 微服務分布式開發框架
    項目介紹:NutzWk 是有五年多歷史的Java Web開源開發框架,其5.x
  • php框架開發:實現最簡單的MVC框架實例教程
    這篇文章主要介紹了php實現最簡單的MVC框架實例教程,講述了MVC框架的運行原理及簡單實現方法,具有不錯的參考借鑑價值,
  • Java程式設計師必會 springmvc-spring-mybatis框架整合搭建傻瓜教程
    ssm是用於將springmvc-spring-mybatis三個框架整合來進行java開發web項目。本文通過ssm三大框架整合的形式講解springmvc的使用教程,最新的框架版本主流IDE,只要按照圖中步驟能夠保證每個人的框架搭建完成並成功運行。這裡使用maven來構建項目,我們需要創建一個名為ssm的maven項目,打包方式為war包。
  • 「計算機畢設」基於springboot開發倉庫管理系統
    基於Springboot開發的倉庫管理系統,底層權限控制已經基於shiro實現了,直接可以作為二次開發框架使用!使用技術本套系統採用的是springboot、mybatisPlus、shiro、layui開發而成,都屬於現在比較流行的技術!看懂這個源碼絕大部分項目都能夠輕鬆應對!
  • JNPF快速開發平臺的四大開發框架介紹之移動端開發框架
    JNPF快速開發平臺包含的第二個重要的開發框架是移動端開發框架,即可在手機端、小程序端、微信公眾號埠、H5頁面端等各種智能移動終端來搭載快速開發平臺所開發出來的各種APP運用。通過移動端APP,使用者可以很方便快捷的在手機上實現工作辦公,隨時隨地掌握公司企業的運營管理情況,並迅速做出決策管理和優化調整,直觀地感受到智能化、信息化管理給企事業單位所帶來的各種效益提升。