Shiro實現jwt驗證流程梳理

2021-08-20 08:22:19 字數 2001 閱讀 8324

shiro jwt實現

jwt驗證原理

由於業務需要用到jwt驗證,需要把實現的使用者密碼驗證方式修改為jwt的驗證方式.

在把之前的登入流程修改為jwt驗證時,是省略掉了shiro內部的login步驟和session管理

**修改如下:

-        subject subject = securityutils.getsubject();

- subject.login(usernamepasswordtoken); //完成登入

- userinfo2 user = (userinfo2) subject.getprincipal();

- session.setattribute(constant.current_user, user);

+ if (userbean.getpasswrod().equals(logininfo.getpassword()))

由於在controller省略掉了登入流程,需要新增filter過濾,在filter中呼叫login步驟,**執行流程:

prehandle->isaccessallowed->isloginattempt->executelogin

login的登入呼叫流程如下

executelogin

login

authenticate

onauthenticate

userrealm::getauthenticationinfo

dogetauthenticationinfo

真正的驗證流程還是在userrealm::dogetauthenticationinfo

@override

protected authenticationinfo dogetauthenticationinfo(authenticationtoken auth) throws authenticationexception

userbean userbean = (userbean) sessionmanager.getsessionentity(token,sessionmanager.user_bean);

if (userbean == null ) else

}if (! jwtutil.verify(token, loginname, userbean.getpasswrod()))

return

new ******authenticationinfo(token, token, "userrealm");

}

為什麼需要在filter中呼叫login,不能在loginuser中呼叫login?

由於shiro預設的驗證方式是基於session的,在基於token驗證的方式中,不能依賴session做為登入的判斷依據.

shiro預定義的authenticationfilter::isaccessallowed

protected

boolean

subject subject = getsubject(request, response);

return subject.isauthenticated();

}

在jwtfilter中,如下

@override

protected

boolean

try

} catch (unauthorizedexception e) catch (authenticationexception ae)

return

true;

}

其中isloginattempt時通過判斷請求的httpheader中是否包含authentication字段,在這裡,自定義的字段取值為jwt token.

php實現jwt簽名 驗證

composer下有個包,可以用來實現jwt,我們重新包裝下拿來用。1 安裝composer包 composer require firebase php jwt2 編寫乙個jwtservice的類 use firebase jwt jwt class jwtservice public funct...

go實現jwt驗證過程

jwt驗證在分布式系統中作為許可權驗證模組的乙個中介軟體,地位尤其重要,特此在這用 記錄一下簡單的設計流程 myclaims 自定義宣告結構體並內嵌jwt.standardclaims jwt包自帶的jwt.standardclaims只包含了官方字段 我們這裡需要額外記錄乙個username欄位,...

Shiro 二 身份驗證基本流程

簡介 在 shiro 中,使用者需要提供 principals 身份 和 credentials 證明 給 shiro,從而應用能驗證使用者身份 principals 身份,即主體的標識屬性,可以是任何東西,如使用者名稱 郵箱等,唯一即可。乙個主體可以有多個 principals,但只有乙個 pri...