最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年06月15日 12:02:23   作者:H.U.C-王子  
本文向向大家仔細(xì)的介紹了如何使用Shiro實(shí)現(xiàn)一個(gè)Http請(qǐng)求的Basic認(rèn)證,有此需求的朋友可以參考下本文

前言

今天跟小伙伴們分享一個(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")
@CrossOrigin
public 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去清除session
        filterChainDefinitionMap.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)證authcBasic
        filterChainDefinitionMap.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)如下情況:

這就代表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)換返回的token
        UsernamePasswordToken  usernamePasswordToken = (UsernamePasswordToken) authenticationToken;//所有Realm
        Collection<Realm> realms = getRealms();
        //最終選擇的Realm
        Collection<Realm> typeRealms = new ArrayList<>();
        for(Realm realm:realms){
            if(...){ //這部分是自己的邏輯判斷,過濾出想要使用的Realm
                typeRealms.add(realm);
            }
        }
        //判斷是單Realm 還是多Realm
        if(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)求情況

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

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

使用PostMan測(cè)試一下

可以發(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)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Win10?IDEA如何連接虛擬機(jī)中的Hadoop(HDFS)

    Win10?IDEA如何連接虛擬機(jī)中的Hadoop(HDFS)

    在虛擬機(jī)上配置Hadoop并修改core-site.xml文件,設(shè)置IP為局域網(wǎng)地址,IDEA中創(chuàng)建Maven項(xiàng)目,添加依賴,并檢查Hadoop重啟和端口轉(zhuǎn)發(fā),提供test.bat文件,通過修改IP簡(jiǎn)化使用過程
    2024-11-11
  • 通俗易懂的Java常見限流算法具體實(shí)現(xiàn)

    通俗易懂的Java常見限流算法具體實(shí)現(xiàn)

    這篇文章主要介紹了Java常見限流算法具體實(shí)現(xiàn)的相關(guān)資料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的實(shí)現(xiàn)原理和具體步驟,并比較了它們的優(yōu)點(diǎn)和缺點(diǎn),需要的朋友可以參考下
    2025-02-02
  • Java中JDBC的使用教程詳解

    Java中JDBC的使用教程詳解

    Java語言操作數(shù)據(jù)庫(kù)?JDBC本質(zhì):其實(shí)是官方(sun公司)定義的一套操作所有關(guān)系型數(shù)據(jù)庫(kù)的規(guī)則,即接口。本文講解了JDBC的使用方法,需要的可以參考一下
    2022-06-06
  • 學(xué)習(xí)Java中的List集合

    學(xué)習(xí)Java中的List集合

    這篇文章主要介紹了學(xué)習(xí)Java中的List集合,List是一個(gè)有序集合, 說是集合,其實(shí)只是只是Collection接口的一個(gè)子接口,下面關(guān)于List的相關(guān)資料 需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-02-02
  • Java并發(fā)編程中的Exchanger解析

    Java并發(fā)編程中的Exchanger解析

    這篇文章主要介紹了Java并發(fā)編程中的Exchanger解析,Exchanger用于線程間數(shù)據(jù)的交換,它提供一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),兩個(gè)線程可以交換彼此的數(shù)據(jù),這兩個(gè)線程通過exchange方法交換數(shù)據(jù),如果第一個(gè)線程先執(zhí)行exchange()方法,需要的朋友可以參考下
    2023-11-11
  • Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解

    Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解

    這篇文章主要為大家介紹了Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • logback 實(shí)現(xiàn)給變量指定默認(rèn)值

    logback 實(shí)現(xiàn)給變量指定默認(rèn)值

    這篇文章主要介紹了logback 實(shí)現(xiàn)給變量指定默認(rèn)值操作,具有很好的參考家價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能

    使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能

    什么是 Spring WebFlux, 它是一種異步的, 非阻塞的, 支持背壓(Back pressure)機(jī)制的Web 開發(fā)框架.下面通過本文給大家介紹使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能,需要的朋友參考下吧
    2018-01-01
  • jdbc連接oracle數(shù)據(jù)庫(kù)功能示例

    jdbc連接oracle數(shù)據(jù)庫(kù)功能示例

    這篇文章主要介紹了jdbc連接oracle數(shù)據(jù)庫(kù)功能,結(jié)合實(shí)例形式詳細(xì)分析了java基于jdbc連接Oracle數(shù)據(jù)庫(kù)的具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • 如何基于Jenkins構(gòu)建Docker鏡像

    如何基于Jenkins構(gòu)建Docker鏡像

    這篇文章主要介紹了基于Jenkins構(gòu)建Docker鏡像,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

自贡市| 枣阳市| 舒城县| 溧阳市| 楚雄市| 衢州市| 边坝县| 阿拉善盟| 沁源县| 威远县| 广灵县| 从化市| 旅游| 东至县| 柘荣县| 恩施市| 饶平县| 聂拉木县| 时尚| 杭州市| 乾安县| 长岛县| 洛宁县| 阳朔县| 汨罗市| 武穴市| 台前县| 迭部县| 石河子市| 区。| 柏乡县| 湾仔区| 甘泉县| 宣威市| 遂平县| 桐庐县| 新田县| 凉城县| 邯郸县| 沐川县| 庆阳市|