2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁技術文章正文

Shiro如何實現Realm接口?

更新時間:2020-08-14 來源:黑馬程序員 瀏覽量:

【1】Realm接口

1597386494848_Realm接口01.jpg


所以,一般在真實的項目中,我們不會直接實現Realm接口,我們一般的情況就是直接繼承AuthorizingRealm,能夠繼承到認證與授權功能,它需要強制重寫兩個方法。

public class DefinitionRealm extends AuthorizingRealm {
 
    /**
	 * @Description 認證
	 * @param authcToken token對象
	 * @return 
	 */
	public abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {
        return null;
    }

	/**
	 * @Description 鑒權
	 * @param principals 令牌
	 * @return
	 */
	public abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){
        return null;
    }
}


【2】自定義Realm

【2.1】需求

1、自定義Realm,取得密碼用于比較。

【2.2】實現

【2.2.1】創建項目

shiro-day01-02realm

1597386505185_Realm接口02.jpg


【2.2.2】定義SecurityService

SecurityService

package com.itheima.shiro.service;

/**
 * @Description:權限服務接口
 */
public interface SecurityService {

    /**
     * @Description 查找密碼按用戶登錄名
     * @param loginName 登錄名稱
     * @return
     */
    String findPasswordByLoginName(String loginName);
}


SecurityServiceImpl

package com.itheima.shiro.service.impl;

import com.itheima.shiro.service.SecurityService;

/**
 * @Description:權限服務層
 */
public class SecurityServiceImpl implements SecurityService {

    @Override
    public String findPasswordByLoginName(String loginName) {
        return "123";
    }
}


【2.2.3】定義DefinitionRealm

package com.itheima.shiro.realm;

import com.itheima.shiro.service.SecurityService;
import com.itheima.shiro.service.impl.SecurityServiceImpl;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * @Description:聲明自定義realm
 */
public class DefinitionRealm extends AuthorizingRealm {

    /**
     * @Description 認證接口
     * @param token 傳遞登錄token
     * @return
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //從AuthenticationToken中獲得登錄名稱
        String loginName = (String) token.getPrincipal();
        SecurityService securityService = new SecurityServiceImpl();
        String password = securityService.findPasswordByLoginName(loginName);
        if ("".equals(password)||password==null){
            throw new UnknownAccountException("賬戶不存在");
        }
        //傳遞賬號和密碼
        return  new SimpleAuthenticationInfo(loginName,password,getName());
    }


    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

}


【2.2.4】編輯shiro.ini

#聲明自定義的realm,且為安全管理器指定realms
[main]
definitionRealm=com.itheima.shiro.realm.DefinitionRealm
securityManager.realms=$definitionRealm
#聲明用戶賬號
#[users]
#jay=123


【3】認證源碼跟蹤

(1)通過debug模式追蹤源碼subject.login(token) 發現。首先是進入Subject接口的默認實現類。果然,Subject將用戶的用戶名密碼委托給了securityManager去做。

1597386632831_Realm接口03.jpg


(2)然后,securityManager說:“臥槽,認證器authenticator小弟,聽說你的大學學的專業就是認證呀,那么這個認證的任務就交給你咯”。遂將用戶的token委托給內部認證組件authenticator去做。

1597386641661_Realm接口04.jpg


(3)事實上,securityManager的內部組件一個比一個懶。內部認證組件authenticator說:“你們傳過來的token我需要拿去跟數據源Realm做對比,這樣吧,這個光榮的任務就交給Realm你去做吧”。Realm對象:“一群大懶蟲!”。

1597386651080_Realm接口05.jpg


(4)Realm在接到內部認證組件authenticator組件后很傷心,最后對電腦前的你說:“大兄弟,對不住了,你去實現一下唄”。從圖中的方法體中可以看到,當前對象是Realm類對象,即將調用的方法是doGetAuthenticationInfo(token)。而這個方法,就是你即將要重寫的方法。如果帳號密碼通過了,那么返回一個認證成功的info憑證。如果認證失敗,拋出一個異常就好了。你說:“什么?最終還是勞資來認證?”沒錯,就是苦逼的你去實現了,誰叫你是程序猿呢。所以,你不得不查詢一下數據庫,重寫doGetAuthenticationInfo方法,查出來正確的帳號密碼,返回一個正確的憑證info。

1597386660293_Realm接口06.jpg


(5)好了,這個時候你自己編寫了一個類,繼承了AuthorizingRealm,并實現了上述doGetAuthenticationInfo方法。你在doGetAuthenticationInfo中編寫了查詢數據庫的代碼,并將數據庫中存放的用戶名與密碼封裝成了一個AuthenticationInfo對象返回。可以看到下圖中,info這個對象是有值的,說明從數據庫中查詢出來了正確的帳號密碼。

1597386670069_Realm接口07.jpg


(6)那么,接下來就很簡單了。把用戶輸入的帳號密碼與剛才你從數據庫中查出來的帳號密碼對比一下即可。token封裝著用戶的帳號密碼,AuthenticationInfo封裝著從數據庫中查詢出來的帳號密碼。再往下追蹤一下代碼,最終到了下圖中的核心區域。如果沒有報異常,說明本次登錄成功。

1597386678516_Realm接口08.jpg



猜你喜歡:

Shiro入門教程:如何實現身份認證?

shiro是啥?Shiro的核心組件介紹

Shiro特點和運行原理詳細介紹

Java軟件高級工程師培訓課程

分享到:
在線咨詢 我要報名
和我們在線交談!