日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請(qǐng)求的Basic認(rèn)證

瀏覽:24日期:2023-07-09 18:16:26
目錄前言實(shí)踐部分測(cè)試部分總結(jié)前言

今天跟小伙伴們分享一個(gè)實(shí)戰(zhàn)內(nèi)容,使用Spring Boot+Shiro實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Http認(rèn)證。

場(chǎng)景是這樣的,我們平時(shí)的工作中可能會(huì)對(duì)外提供一些接口,如果這些接口不做一些安全認(rèn)證,什么人都可以訪問,安全性就太低了,所以我們的目的就是增加一個(gè)接口的認(rèn)證機(jī)制,防止別人通過接口攻擊服務(wù)器。

至于Shiro是什么,Http的Basic認(rèn)證是什么,王子就簡(jiǎn)單介紹一下,詳細(xì)內(nèi)容請(qǐng)自行了解。

Shiro是一個(gè)Java的安全框架,可以簡(jiǎn)單實(shí)現(xiàn)登錄、鑒權(quán)等等的功能。

Basic認(rèn)證是一種較為簡(jiǎn)單的HTTP認(rèn)證方式,客戶端通過明文(Base64編碼格式)傳輸用戶名和密碼到服務(wù)端進(jìn)行認(rèn)證,通常需要配合HTTPS來保證信息傳輸?shù)陌踩?/p>實(shí)踐部分

首先說明一下測(cè)試環(huán)境。

王子已經(jīng)有了一套集成好Shiro的Spring Boot框架,這套框架詳細(xì)代碼就不做展示了,我們只來看一下測(cè)試用例。

要測(cè)試的接口代碼如下:

/** * @author liumeng */@RestController@RequestMapping('/test')@CrossOriginpublic class TestAppController extends BaseController { /** * 數(shù)據(jù)匯總 */ @GetMapping('/list') public AjaxResult test() {return success('測(cè)試接口!'); }}

使用Shiro,一定會(huì)有Shiro的攔截器配置,這部分代碼如下:

/** * Shiro過濾器配置 */ @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();// Shiro的核心安全接口,這個(gè)屬性是必須的shiroFilterFactoryBean.setSecurityManager(securityManager);// 身份認(rèn)證失敗,則跳轉(zhuǎn)到登錄頁面的配置shiroFilterFactoryBean.setLoginUrl(loginUrl);// 權(quán)限認(rèn)證失敗,則跳轉(zhuǎn)到指定頁面shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);// Shiro連接約束配置,即過濾鏈的定義LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();// 對(duì)靜態(tài)資源設(shè)置匿名訪問filterChainDefinitionMap.put('/favicon.ico**', 'anon');filterChainDefinitionMap.put('/lr.png**', 'anon');filterChainDefinitionMap.put('/css/**', 'anon');filterChainDefinitionMap.put('/docs/**', 'anon');filterChainDefinitionMap.put('/fonts/**', 'anon');filterChainDefinitionMap.put('/img/**', 'anon');filterChainDefinitionMap.put('/ajax/**', 'anon');filterChainDefinitionMap.put('/js/**', 'anon');filterChainDefinitionMap.put('/lr/**', 'anon');filterChainDefinitionMap.put('/captcha/captchaImage**', 'anon');// 退出 logout地址,shiro去清除sessionfilterChainDefinitionMap.put('/logout', 'logout');// 不需要攔截的訪問filterChainDefinitionMap.put('/login', 'anon,captchaValidate');filterChainDefinitionMap.put('/ssoLogin', 'anon'); // 開啟Http的Basic認(rèn)證filterChainDefinitionMap.put('/test/**', 'authcBasic'); // 注冊(cè)相關(guān)filterChainDefinitionMap.put('/register', 'anon,captchaValidate');Map<String, Filter> filters = new LinkedHashMap<String, Filter>();filters.put('onlineSession', onlineSessionFilter());filters.put('syncOnlineSession', syncOnlineSessionFilter());filters.put('captchaValidate', captchaValidateFilter());filters.put('kickout', kickoutSessionFilter());// 注銷成功,則跳轉(zhuǎn)到指定頁面filters.put('logout', logoutFilter());shiroFilterFactoryBean.setFilters(filters);// 所有請(qǐng)求需要認(rèn)證authcBasicfilterChainDefinitionMap.put('/**', 'user,kickout,onlineSession,syncOnlineSession');shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean; }

這里我們要關(guān)注的是代碼中的

filterChainDefinitionMap.put('/test/**', 'authcBasic'); 這部分代碼,它指定了我們的測(cè)試接口啟動(dòng)了Http的Basic認(rèn)證,這就是我們的第一步。

做到這里我們可以嘗試的去用瀏覽器訪問一下接口,會(huì)發(fā)現(xiàn)如下情況:

Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請(qǐng)求的Basic認(rèn)證

這就代表Basic認(rèn)證已經(jīng)成功開啟了,這個(gè)時(shí)候我們輸入系統(tǒng)的用戶名和密碼,你以為它就能成功訪問了嗎?

答案是否定的,我們只是開啟了認(rèn)證,但并沒有實(shí)現(xiàn)認(rèn)證的邏輯。

王子通過閱讀部分Shiro源碼,發(fā)現(xiàn)每次發(fā)送請(qǐng)求后,都會(huì)調(diào)用ModularRealmAuthenticator這個(gè)類的doAuthenticate方法,源碼如下:

protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {assertRealmsConfigured();Collection<Realm> realms = getRealms();if (realms.size() == 1) { return doSingleRealmAuthentication(realms.iterator().next(), authenticationToken);} else { return doMultiRealmAuthentication(realms, authenticationToken);} }

可以看出,這個(gè)方法主要就是對(duì)Realm進(jìn)行了管理,因?yàn)槲覀兊南到y(tǒng)本身已經(jīng)有兩個(gè)Ream了,針對(duì)的是不同情況的權(quán)限驗(yàn)證,所以為了使用起來不沖突,我們可以繼承這個(gè)類來實(shí)現(xiàn)我們自己的邏輯,在配置類中增加如下內(nèi)容即可:

@Bean public ModularRealmAuthenticator modularRealmAuthenticator(){//用自己重新的覆蓋UserModularRealmAuthericator modularRealmAuthericator = new UserModularRealmAuthericator();modularRealmAuthericator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());return modularRealmAuthericator; }

然后在我們自己的UserModularRealmAuthericator類中重寫doAuthenticate方法就可以了,這里面的具體實(shí)現(xiàn)邏輯就要看你們自己的使用場(chǎng)景了。

我們可以自己新創(chuàng)建一個(gè)Realm來單獨(dú)校驗(yàn)Basic認(rèn)證的情況,或者共用之前的Realm,這部分就自由發(fā)揮了。

大概內(nèi)容如下:

public class UserModularRealmAuthericator extends ModularRealmAuthenticator { private static final Logger logger = LoggerFactory.getLogger(UserModularRealmAuthericator.class); @Override protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {assertRealmsConfigured();//強(qiáng)制轉(zhuǎn)換返回的tokenUsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;//所有RealmCollection<Realm> realms = getRealms();//最終選擇的RealmCollection<Realm> typeRealms = new ArrayList<>();for(Realm realm:realms){ if(...){ //這部分是自己的邏輯判斷,過濾出想要使用的RealmtypeRealms.add(realm); }}//判斷是單Realm 還是多Realmif(typeRealms.size()==1){ return doSingleRealmAuthentication(typeRealms.iterator().next(),usernamePasswordToken);}else{ return doMultiRealmAuthentication(typeRealms,usernamePasswordToken);} }}

Realm的具體實(shí)現(xiàn)代碼這里就不做演示了,無非就是判斷用戶名密碼是否能通過校驗(yàn)的邏輯。如果不清楚,可以自行了解Realm的實(shí)現(xiàn)方式。

Realm校驗(yàn)實(shí)現(xiàn)后,Basic認(rèn)證就已經(jīng)實(shí)現(xiàn)了。

測(cè)試部分

接下來我們?cè)俅问褂脼g覽器對(duì)接口進(jìn)行測(cè)試,輸入用戶名和密碼,就會(huì)發(fā)現(xiàn)接口成功響應(yīng)了。

我們來抓取一下請(qǐng)求情況

Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請(qǐng)求的Basic認(rèn)證

可以發(fā)現(xiàn),Request Header中有了Basic認(rèn)證的信息Authorization: Basic dGVzdDoxMjM0NTY=

這部分內(nèi)容是這樣的,Basic為一個(gè)固定的寫法,dGVzdDoxMjM0NTY=這部分內(nèi)容是userName:Password組合后的Base64編碼,所以我們只要給第三方提供這個(gè)編碼,他們就可以通過編碼訪問我們的接口了。

使用PostMan測(cè)試一下

Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請(qǐng)求的Basic認(rèn)證

可以發(fā)現(xiàn)接口是可以成功訪問的。

總結(jié)

到這里本篇文章就結(jié)束了,王子向大家仔細(xì)的介紹了如何使用Shiro實(shí)現(xiàn)一個(gè)Http請(qǐng)求的Basic認(rèn)證,是不是很簡(jiǎn)單呢。

以上就是Spring Boot+Shiro實(shí)現(xiàn)一個(gè)Http請(qǐng)求的Basic認(rèn)證的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot+Shiro Http請(qǐng)求的Basic認(rèn)證的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产成人一区二区三区| 日本强好片久久久久久aaa| 蜜桃一区二区三区在线观看| 成人国产精品一区二区免费麻豆| 四虎在线精品| 亚洲欧美久久| 亚洲网站视频| 婷婷综合六月| 国产福利电影在线播放| 亚洲久久在线| 好看的av在线不卡观看| 久久久久97| 精品视频一区二区三区四区五区| 欧美日韩18| 久久三级毛片| 美女久久久久久| 国产欧美一区二区精品久久久| 在线精品小视频| 国产亚洲一区二区手机在线观看| 精品久久97| 伊人久久在线| 99久久久久| 黄色日韩在线| 亚洲综合欧美| 免费成人在线观看| 日本不卡一二三区黄网| 在线一区欧美| 日本不卡高清| 久久超碰99| 色爱综合av| 亚洲少妇一区| 国产乱子精品一区二区在线观看| 国产精品视频一区视频二区| 麻豆中文一区二区| 视频福利一区| 日韩精品一二三四| 国产视频网站一区二区三区| 国产精品777777在线播放 | 在线看片福利| 99视频一区| 国产精品网站在线看| 国产日韩电影| 久久亚洲图片| 精品中文字幕一区二区三区| 亚洲www免费| 日韩综合一区二区三区| 精品一区二区男人吃奶| 亚洲欧洲一区| 久久精品国产999大香线蕉| 99国产精品视频免费观看一公开| 欧美日韩1区| 亚洲福利专区| 国产日韩一区二区三区在线播放| 99久久精品网| 国产成人1区| 日韩国产一二三区| 视频小说一区二区| 精品无人区麻豆乱码久久久| 亚洲天堂av资源在线观看| 高潮久久久久久久久久久久久久| 日韩一区欧美二区| 婷婷成人在线| 国产精品一区二区精品视频观看 | 偷拍欧美精品| 91精品麻豆| 欧美精品国产白浆久久久久| 99热精品久久| 福利一区视频| 国产精品久久久久av蜜臀| 亚洲一区欧美激情| 91看片一区| 91看片一区| 国产日韩电影| 免费观看不卡av| 午夜精品久久久久久久久久蜜桃| 欧美国产先锋| 国产麻豆一区二区三区 | 成人台湾亚洲精品一区二区| 日韩在线观看中文字幕| 黄色成人91| 中国字幕a在线看韩国电影| 久久av日韩| 国产成人精品一区二区免费看京 | 欧美黄色一区| 国产探花一区| 亚洲丝袜啪啪| 好吊一区二区三区| 亚洲一区网站| 日韩免费精品| 麻豆91精品| 日韩中文字幕一区二区三区| 国产精品社区| 日韩在线麻豆| 免费在线观看日韩欧美| 少妇高潮一区二区三区99| 亚洲精品九九| 国产精品最新自拍| 四虎成人av| 福利一区二区| 欧美亚洲精品在线| 丝袜美腿一区二区三区| 日韩精品社区| 三级小说欧洲区亚洲区| 国产精品毛片在线| 国产精品hd| 亚洲深爱激情| 蜜臀国产一区| 日韩高清中文字幕一区| 黄色网一区二区| 日韩精品一级二级| 日韩av有码| 男女男精品网站| 国产精品成人一区二区不卡| 在线观看一区| 久久亚洲精品中文字幕蜜潮电影| 午夜久久av| 久久久久午夜电影| 日韩欧美另类中文字幕| 精品国产亚洲日本| 亚洲一级影院| 麻豆精品一区二区综合av| 日韩精品午夜| 日韩一区中文| 免费在线日韩av| 999国产精品| 久久国产尿小便嘘嘘| 日本精品不卡| 国产欧美自拍| 99视频精品| 久久电影tv| 日韩**一区毛片| 99久久久久| 国产精品麻豆久久| 四虎精品一区二区免费| 成人亚洲欧美| 欧美一区成人| 亚洲网址在线观看| 久久国产精品成人免费观看的软件| 亚洲欧美专区| 99久久精品网站| 国产一区二区三区四区大秀| 蜜桃视频一区二区三区| 久久av在线| 性欧美69xoxoxoxo| 国产综合视频| 日韩黄色大片网站| 日韩精品一区二区三区中文字幕| 日韩在线卡一卡二| 欧美特黄视频| 美女毛片一区二区三区四区| 日韩深夜视频| 蜜桃av在线播放| 九九精品调教| 久久精品免费一区二区三区 | 在线观看精品| se01亚洲视频| 欧美日韩一二三四| 1000部精品久久久久久久久| 天堂√8在线中文| 日本久久成人网| 日本成人在线一区| 国产亚洲高清在线观看| 国产日韩精品视频一区二区三区| 在线看片一区| 欧美日韩xxxx| www.九色在线| 999国产精品999久久久久久| 欧美1区免费| 丝袜a∨在线一区二区三区不卡| 欧洲激情综合| 国产精品欧美日韩一区| 精品国产亚洲一区二区三区| sm久久捆绑调教精品一区| 色黄视频在线观看| 亚洲色图国产| 国产精品一区二区av交换| 国产精品theporn| 香蕉成人av| 中文无码日韩欧| 国产女人18毛片水真多18精品| 国产高清亚洲| 红桃视频国产一区| 久久99国产精品视频| 免费久久精品| 国产欧美一区二区色老头| 中文字幕成在线观看| 99综合视频| 免费在线日韩av| 黄色亚洲大片免费在线观看| 日本精品久久| 99久久久久国产精品| 91国内精品| 蜜桃tv一区二区三区| 亚欧成人精品| 四季av一区二区凹凸精品| 日本91福利区| 99国产成+人+综合+亚洲欧美| 国产精品亚洲二区| 亚洲永久字幕| 99精品电影|