springboot中如何去整合shrio實(shí)例分享
背景:
上文學(xué)習(xí)了shrio 基本概念后,本章將進(jìn)一步的落地實(shí)踐學(xué)習(xí),在springboot中如何去整合shrio,整個(gè)過(guò)程步驟有個(gè)清晰的了解。
利用Shiro進(jìn)行登錄認(rèn)證主要步驟:
1. 添加依賴:首先,在pom.xml
文件中添加Spring Boot和Shiro的相關(guān)依賴。
<!-- Spring Boot --> <dependency> ????<groupId>org.springframework.boot</groupId> ????<artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Shiro --> <dependency> ????<groupId>org.apache.shiro</groupId> ????<artifactId>shiro-spring-boot-starter</artifactId> ????<version>1.7.1</version> </dependency> |
2. 創(chuàng)建Shiro配置類:創(chuàng)建一個(gè)ShiroConfig
類,用于配置Shiro的相關(guān)信息和組件。(對(duì)于配置的解釋和作用見第三章雜談)
@Configuration public?class?ShiroConfig { ????// 配置安全管理器 ????@Bean ????public?DefaultWebSecurityManager securityManager() { ????????DefaultWebSecurityManager securityManager =?new?DefaultWebSecurityManager(); ????????securityManager.setRealm(myRealm()); ????????return?securityManager; ????} ????// 配置自定義Realm ????@Bean ????public?MyRealm myRealm() { ????????return?new?MyRealm(); ????} ????// 配置Shiro過(guò)濾器 ????@Bean ????public?ShiroFilterFactoryBean shiroFilterFactoryBean() { ????????ShiroFilterFactoryBean shiroFilterFactoryBean =?new?ShiroFilterFactoryBean(); ????????shiroFilterFactoryBean.setSecurityManager(securityManager()); ????????shiroFilterFactoryBean.setLoginUrl("/login");?// 設(shè)置登錄頁(yè)面 ????????shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");?// 設(shè)置未授權(quán)頁(yè)面 ????????Map<String, String> filterChainDefinitionMap =?new?LinkedHashMap<>(); ????????// 允許匿名訪問(wèn)的路徑 ????????filterChainDefinitionMap.put("/login",?"anon"); ????????filterChainDefinitionMap.put("/static/**",?"anon"); ????????// 需要認(rèn)證才能訪問(wèn)的路徑 ????????filterChainDefinitionMap.put("/**",?"authc"); ????????shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); ????????return?shiroFilterFactoryBean; ????} }
3. 創(chuàng)建自定義Realm:創(chuàng)建一個(gè)MyRealm
類,繼承AuthorizingRealm
并實(shí)現(xiàn)相關(guān)方法,用于處理認(rèn)證和授權(quán)邏輯
public?class?MyRealm?extends?AuthorizingRealm { ????// 處理認(rèn)證邏輯 ????@Override ????protected?AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)?throws?AuthenticationException { ????????// 從token中獲取用戶名 ????????String username = (String) authenticationToken.getPrincipal(); ????????// 模擬從數(shù)據(jù)庫(kù)或其他存儲(chǔ)中獲取用戶信息 ????????// 例如,從數(shù)據(jù)庫(kù)中查詢用戶信息并返回 ????????String dbPassword =?"123456";?// 假設(shè)從數(shù)據(jù)庫(kù)中查詢的密碼是123456 ????????// 返回認(rèn)證信息,包括用戶名和密碼 ????????return?new?SimpleAuthenticationInfo(username, dbPassword, getName()); ????} ????// 處理授權(quán)邏輯 ????@Override ????protected?AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { ????????// 從PrincipalCollection中獲取用戶名 ????????String username = (String) principalCollection.getPrimaryPrincipal(); ????????// 模擬從數(shù)據(jù)庫(kù)或其他存儲(chǔ)中獲取用戶角色和權(quán)限信息 ????????// 例如,從數(shù)據(jù)庫(kù)中查詢用戶對(duì)應(yīng)的角色和權(quán)限并返回 ????????Set<String> roles =?new?HashSet<>(); ????????roles.add("admin");?// 假設(shè)用戶擁有admin角色 ????????Set<String> permissions =?new?HashSet<>(); ????????permissions.add("user:read");?// 假設(shè)用戶擁有user:read權(quán)限 ????????// 創(chuàng)建授權(quán)信息 ????????SimpleAuthorizationInfo authorizationInfo =?new?SimpleAuthorizationInfo(); ????????authorizationInfo.setRoles(roles); ????????authorizationInfo.setStringPermissions(permissions); ????????return?authorizationInfo; ????} }
4. 創(chuàng)建登錄接口和登錄頁(yè)面:創(chuàng)建一個(gè)登錄接口處理用戶的登錄請(qǐng)求
@Controller public?class?LoginController { ????@GetMapping("/login") ????public?String login() { ????????return?"login"; ????} ????@PostMapping("/login") ????public?String doLogin(String username, String password) { ????????// 執(zhí)行登錄邏輯 ????????Subject currentUser = SecurityUtils.getSubject(); ????????UsernamePasswordToken token = new?UsernamePasswordToken(username, password); ????????try?{ ????????????currentUser.login(token); // 執(zhí)行登錄 ????????????return?"redirect:/home"; // 登錄成功后跳轉(zhuǎn)到首頁(yè) ????????} catch?(AuthenticationException e) { ????????????return?"redirect:/login-error"; // 登錄失敗后跳轉(zhuǎn)到錯(cuò)誤頁(yè)面 ????????} ????} }
整體的執(zhí)行流程:
用戶在瀏覽器中訪問(wèn)登錄頁(yè)面,輸入用戶名和密碼,并點(diǎn)擊登錄按鈕。
Controller層的
LoginController
類中的doLogin
方法被調(diào)用,該方法接收用戶名和密碼作為參數(shù)。創(chuàng)建一個(gè)
Subject
對(duì)象,該對(duì)象代表當(dāng)前正在與應(yīng)用程序交互的用戶。創(chuàng)建一個(gè)
UsernamePasswordToken
對(duì)象,將用戶名和密碼設(shè)置為該對(duì)象的屬性。調(diào)用
Subject
對(duì)象的login
方法,將UsernamePasswordToken
對(duì)象作為參數(shù)傳遞進(jìn)去。Subject
對(duì)象將UsernamePasswordToken
對(duì)象傳遞給Shiro進(jìn)行認(rèn)證。Shiro框架會(huì)調(diào)用
MyRealm
類中的doGetAuthenticationInfo
方法,該方法用于處理認(rèn)證邏輯。在
doGetAuthenticationInfo
方法中,從UsernamePasswordToken
對(duì)象中獲取用戶名。可以根據(jù)需要,從數(shù)據(jù)庫(kù)或其他存儲(chǔ)中獲取與用戶名對(duì)應(yīng)的用戶信息,例如密碼等。
將獲取到的用戶信息與
UsernamePasswordToken
對(duì)象中的密碼進(jìn)行比較,判斷用戶是否通過(guò)認(rèn)證。如果認(rèn)證成功,創(chuàng)建一個(gè)
SimpleAuthenticationInfo
對(duì)象,將用戶名、數(shù)據(jù)庫(kù)中的密碼和Realm名稱作為參數(shù)傳遞給它。SimpleAuthenticationInfo
對(duì)象會(huì)被返回給Shiro框架,表示認(rèn)證成功。Shiro框架會(huì)將認(rèn)證成功的信息保存在
Subject
對(duì)象中。如果認(rèn)證失敗,將拋出
AuthenticationException
異常。在
doLogin
方法中,通過(guò)捕獲AuthenticationException
異常,可以處理登錄失敗的情況,例如重定向到登錄失敗頁(yè)面。如果登錄成功,可以根據(jù)需要執(zhí)行一些操作,例如重定向到首頁(yè)或其他需要登錄后才能訪問(wèn)的頁(yè)面。
總結(jié)起來(lái),整個(gè)執(zhí)行流程如下:
- 用戶輸入用戶名和密碼,并提交登錄表單。
- Controller層的
LoginController
類中的doLogin
方法接收到登錄請(qǐng)求。 - 創(chuàng)建
Subject
對(duì)象,代表當(dāng)前用戶。 - 創(chuàng)建
UsernamePasswordToken
對(duì)象,將用戶名和密碼設(shè)置為其屬性。 - 調(diào)用
Subject
對(duì)象的login
方法,將UsernamePasswordToken
對(duì)象作為參數(shù)傳入。 - Shiro框架調(diào)用
MyRealm
類中的doGetAuthenticationInfo
方法,處理認(rèn)證邏輯。 - 在
doGetAuthenticationInfo
方法中,獲取用戶名和密碼,并與數(shù)據(jù)庫(kù)中的信息進(jìn)行比較。 - 如果認(rèn)證成功,返回一個(gè)
SimpleAuthenticationInfo
對(duì)象,表示認(rèn)證通過(guò)。 - 如果認(rèn)證失敗,拋出
AuthenticationException
異常。 - 在
doLogin
方法中,根據(jù)認(rèn)證結(jié)果執(zhí)行相應(yīng)的操作,例如重定向到登錄成功頁(yè)面或登錄失敗頁(yè)面。
到此這篇關(guān)于springboot中如何去整合shrio實(shí)例分享的文章就介紹到這了,更多相關(guān)springboot整合shrio內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
kafka運(yùn)維consumer-groups.sh消費(fèi)者組管理
這篇文章主要為大家介紹了kafka運(yùn)維consumer-groups.sh消費(fèi)者組管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11MyBatis?Generator生成數(shù)據(jù)庫(kù)模型實(shí)現(xiàn)示例
這篇文章主要為大家介紹了MyBatis?Generator生成數(shù)據(jù)庫(kù)模型實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Security6.4.2?自定義異常中統(tǒng)一響應(yīng)遇到的問(wèn)題
本文主要介紹了Security6.4.2?自定義異常中統(tǒng)一響應(yīng)遇到的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Maven pom的distributionManagement配置方式
文章主要介紹了Maven的distributionManagement配置方式,以及它的作用、配置方法和重要性,distributionManagement用于指定構(gòu)件的發(fā)布位置,包括下載URL、狀態(tài)等,文章還詳細(xì)解釋了如何配置repository和snapshotRepository,以及它們的用途和區(qū)別2025-01-01