<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在前些天的文章中,我們瞭解到困惑了我們好幾天的問題是由於jfinal新版中使用undertowServer方式啟動,其嵌入filter的方式有變動,所以導致網上檢索到的通過web.xml嵌入filter失敗。
在不考慮修改undertowServer的情況下,也就意味著我們需要找到一種在undertowServer環境下,嵌入shiro的方式。
今天,我們就來嘗試一種通過攔截器來實現的Stateless Jfinal 嵌入方式。
個人對Stateless的理解就是前後端分離,兩次請求互相獨立,通過約定的token等內容判斷是否是同一個使用者。
因此這要求,登入介面需要給使用者生成一個隨機的token,以便使用者後續存取的時候帶上。
登入介面首先需要我們存取資料庫,以及通過特定演演算法來驗證使用者名稱與密碼是否匹配。如果匹配,則生成隨機的字串,即token,並儲存在redis中,注意,對映關係是token為key,value為使用者資訊,可以是使用者名稱,也可以是使用者id等使用者唯一標識。
@Clear public void Login() { String name = getPara("name"); String password = getPara("password"); if ("admin".equals(name)) { // TODO 判斷密碼與使用者名稱是否正確 Cache cache = Redis.use(); String token = StrKit.getRandomUUID(); cache.set("TOKEN:" + token, name); renderText(token); } else { renderText("使用者名稱與密碼錯誤"); } }
另外,需要注意的有兩點:
package com.holdoa.core.interceptor; import com.holdoa.core.controller.BaseController; import com.holdoa.core.filter.JWTToken; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; import com.jfinal.core.Controller; import com.jfinal.kit.LogKit; import com.jfinal.kit.StrKit; import org.apache.shiro.SecurityUtils; import org.apache.shiro.aop.MethodInvocation; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.aop.AnnotationsAuthorizingMethodInterceptor; import org.apache.shiro.subject.Subject; import java.lang.reflect.Method; public class MyShiroInterceptor extends AnnotationsAuthorizingMethodInterceptor implements Interceptor { public MyShiroInterceptor() { getMethodInterceptors(); } public void intercept(final Invocation inv) { try { String token = inv.getController().getHeader("token"); if (StrKit.isBlank(token)) { BaseController b = (BaseController) inv.getController(); b.renderAppError("缺少token"); return; } else { Subject s = SecurityUtils.getSubject(); JWTToken jwtToken = new JWTToken(token); s.login(jwtToken); inv.invoke(); } } catch (Throwable e) { if (e instanceof AuthorizationException) { doProcessuUnauthorization(inv.getController()); } LogKit.warn("許可權錯誤:", e); try { throw e; } catch (Throwable throwable) { throwable.printStackTrace(); } } } /** * 未授權處理 * * @param controller controller */ private void doProcessuUnauthorization(Controller controller) { controller.redirect("/login/noLogin"); } }
上面的程式碼很長,我們重點看其中的這幾行:
String token = inv.getController().getHeader("token"); if (StrKit.isBlank(token)) { BaseController b = (BaseController) inv.getController(); b.renderAppError("缺少token"); return; } else { Subject s = SecurityUtils.getSubject(); JWTToken jwtToken = new JWTToken(token); s.login(jwtToken); inv.invoke(); }
邏輯可以描述為:獲取token,若不為空,將其轉換為JWTToken物件,然後呼叫shiro的登入介面:s.login(jwtToken)
。
而shiro的login方法會觸發自定義Realm中的驗證介面:
/** * 自定義認證 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException { String token = (String) auth.getCredentials(); // 解密獲得username,用於和資料庫進行對比 String userName = JwtUtils.getUsername(token); if (userName == null || userName == "") { throw new AuthenticationException("token 校驗失敗"); } return new SimpleAuthenticationInfo(token, token, getName()); }
其中,JwtUtils。getUsername的具體程式碼如下,和設定token是對應的:
/** * @return token中包含的使用者名稱 */ public static String getUsername(String token) { Cache cache = Redis.use(); String username = (String)cache.get(RedisKeyPreFix.NEW_OA_MANAGE_TOKEN_PREFIX + token); return username; }
如此,便做到了shiro的嵌入。
目前欠缺的一個問題是,不能實現shiro的註解來進行許可權驗證,這個問題我們還準備藉助ShiroPlugin來實現,由於jfinal已經升級到4.8了,而shiroPlugin目前還停留在支援jfinal 3.x的版本,所以需要我們下載jfianl-shiro-plugin原始碼做一些修改。
到此這篇關於jfinal中stateless模式嵌入shiro驗證的實現方式的文章就介紹到這了,更多相關jfinal shiro驗證內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45