Shiro處理簡單的身份驗證的分析及例項
在兩天在看Shiro,開濤兄的教程還是寫的比較易讀,差不多看了一天吧,就準備拿來用了。
可能是想的太簡單了,在用的時候確實碰到一些問題,就拿最簡單的身份驗證來說吧:
需要說明的是,這裡是整合在Spring中使用,身份驗證我直接使用了Shiro提供的
org.apache.shiro.web.filter.authc.FormAuthenticationFilter
如果url應用了該攔截器,那麼處理流程是大致這樣的:
由於之前用markdown花的流程圖顯示不下,所以還是改成圖片形式了。
比如我們要用FormAuthenticationFilter來做一個簡單的身份驗證的話,也是很簡單的:
- 首先我們分別寫好處理登陸的get請求和post請求
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String showLoginPage() {
return "user/login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String submitLoginForm(User user, HttpServletRequest request ,
Model model) {
String errorClassName = (String) request
.getAttribute("shiroLoginFailure");
String authticationError = null;
if (UnknownAccountException.class.getName().equals(errorClassName)) {
authticationError = "使用者名稱/密碼錯誤";
} else if (IncorrectCredentialsException.class.getName().equals(
errorClassName)) {
authticationError = "使用者名稱/密碼錯誤";
} else if (errorClassName != null) {
authticationError = "未知錯誤:" + errorClassName;
}
model.addAttribute("authticationError", authticationError);
return showLoginPage();
}
在post請求中我們需要根據request中的錯誤資訊來翻譯出需要顯示的訊息內容。若需要國際化的話,也可以用ResourceBundle來做。
需要注意的是,只有當登陸報錯了才會進來這個方法中來。若身份驗證成功的話,會直接跳轉到之前的訪問地址或是successfulUrl去。好了,接下來看看配置檔案:
<!-- 憑證匹配器 這裡簡單寫了一個無需加密的匹配 -->
<bean id="credentialsMatcher" class="com.zhu.prototype.shiro.credential.PlainPasswordMatcher">
</bean>
<bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
<property name="credentialsMatcher" ref="credentialsMatcher"></property>
<property name="authenticationQuery" value="select password from user where username = ?"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 安全管理器 DefaultWebSecurityManager預設使用ServletContainerSessionManager來管理session-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realms">
<list>
<ref bean="jdbcRealm" />
</list>
</property>
</bean>
<!-- 基於Form表單的身份驗證過濾器 -->
<bean id="formAuthenticationFilter"
class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<property name="usernameParam" value="username" />
<property name="passwordParam" value="password" />
<property name="loginUrl" value="/login" />
<property name="successUrl" value="/news/newsList"></property>
</bean>
登陸成功後,會在session中預設設定幾個屬性:
{org.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEY=true,
org.apache.shiro.web.session.HttpServletSession.HOST_SESSION_KEY=0:0:0:0:0:0:0:1,
org.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEY=zhu}
如果我們需要註冊attribute的話,我的想法是繼承FormAuthenticationFilter(不知道Shiro是否有提供別的配置來完成?),然後重寫onLoginSuccess(…),原定義如下:
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject,
ServletRequest request, ServletResponse response) throws Exception {
issueSuccessRedirect(request, response);
//we handled the success redirect directly, prevent the chain from continuing:
return false;
}
可改寫為
@Override
protected boolean onLoginSuccess(AuthenticationToken token,
Subject subject, ServletRequest request, ServletResponse response)
throws Exception {
super.onLoginSuccess(token, subject, request, response);
initCustomSessionAttributes(((HttpServletRequest) request)
.getSession(false), token);
return false;
}
protected void initCustomSessionAttributes(HttpSession session,
AuthenticationToken token) {
String username = token.getPrincipal().toString();
User user = userService.getUserByUsername(username);
UserPreferences preferences = new UserPreferences();
preferences.setUsername(user.getUsername());
session.setAttribute("userPreferences", preferences);
}
最後給出Shiro中常見的驗證不通過報的錯誤:
- DisabledAccountException (禁用的帳號)
- LockedAccountException (鎖定的帳號)
- UnknownAccountException(錯誤的帳號)
- ExcessiveAttemptsException(登入失敗次數過多)
- IncorrectCredentialsException (錯誤的憑證)
- ExpiredCredentialsException (過期的憑證)
- ……
相關推薦
Shiro處理簡單的身份驗證的分析及例項
在兩天在看Shiro,開濤兄的教程還是寫的比較易讀,差不多看了一天吧,就準備拿來用了。 可能是想的太簡單了,在用的時候確實碰到一些問題,就拿最簡單的身份驗證來說吧: 需要說明的是,這裡是整合在Spring中使用,身份驗證我直接使用了Shiro提供的
比特幣區塊結構Merkle樹及簡單支付驗證分析
關註 公眾號 分支 images 相對 一份 出現 受限 字節 在比特幣網絡中,不是每個節點都有能力儲存完整的區塊鏈數據,受限於存儲空間的的限制,很多節點是以SPV(Simplified Payment Verification簡單支付驗證)錢包接入比特幣網絡,通過簡單支付
20181117--深入淺出區塊鏈Merkle樹及簡單支付驗證分析
Merkle樹 驗證交易的過程和檔案驗證很相似,可以人為每個交易是一個小資料塊,但比特幣使用Merkle樹的方式進行驗證,相對於雜湊列表,Merkle樹是一種雜湊二叉樹,它的明顯的一個好處是可以單獨拿出一個分支來(作為一個小樹)對部分資料進行校驗,更加高效。 我們回看下上面的區塊結
如何解決 Windows 例項出現身份驗證錯誤及更正 CredSSP
現象描述 通過微軟的 RDP 協議客戶端 遠端連線 Windows 例項時報錯:出現身份驗證錯誤,要求的函式不受支援(The function requested is not supported)。 原因分析 微軟官方 2018 年 5 月更新了憑據安全支援提供程
asp.net mvc 最簡單身份驗證 [Authorize]通過的標準
dmi api 什麽 rgs new auth 單身 mar name [Authorize] public ContentResult Index2() { return Content("驗證通過了");
Shiro學習之身份驗證
druid 進行 out 總結 文件 sele path iss .get 身份驗證,即在應用中誰能證明他就是他本人。一般提供如他們的身份ID一些標識信息來表明他就是他本人,如提供身份證,用戶名/密碼來證明。 在shiro中,用戶需要提供principals (身份)和cr
Shiro中最簡單的一個身份驗證例子
Shiro作為一個Java安全框架,身份驗證是它最基本的功能。 首先給出shiro的Maven配置 <dependencies> <dependency>
Camera影象處理原理及例項分析-重要影象概念
Camera影象處理原理及例項分析 作者:劉旭暉 [email protected] 轉載請註明出處 BLOG:http://blog.csdn.net/colorant/ 做為拍照手機的核心模組之一,camera sensor 效果的調整,涉及到眾多
登錄驗證流程及token處理
content contain mod tro super pub pass -s name 一、登錄流程 1、先驗證驗證碼,通過以後調用登錄接口驗證密碼,否則返回登錄頁。 2、驗證密碼,如果相等返回result,否則返回空的result。 3、在controller中獲取
Shiro:學習筆記(1)——身份驗證
wan param import println cal 類型 classname zhang ets Shiro——學習筆記(1) 1.核心概念 1.Shiro不會自己去維護用戶、維護權限;這些需要我們自己去設計/提供;然後通過相應的接口註入給Shiro。2.應用代碼直接
asp.net Web API 身份驗證 不記名令牌驗證 Bearer Token Authentication 簡單實現
驗證 tca star ati manager ace .com return public 1. Startup.Auth.cs文件 添加屬性 1 public static OAuthBearerAuthenticati
shiro多realm驗證之——shiro實現不同身份使用不同Realm進行驗證(轉)
manager 數據表 edi 用戶驗證 clas tails oauth false bject 轉自: http://blog.csdn.net/xiangwanpeng/article/details/54802509
ASP.NET MVC:窗體身份驗證及角色權限管理示例
rms 客戶端請求 系統 contex config 尋找 sign 分享圖片 更多 前言 本來使用Forms Authentication進行用戶驗證的方式是最常見的,但系統地闡明其方法的文章並不多見,網上更多的文章都是介紹其中某一部分的使用方法或實現原理,而更多的朋
Shiro安全框架簡介以及身份驗證
退出 ica 報錯 資源 帳戶 rac localhost file 手機號 一、Shiro簡介 官網 http://shiro.apache.org/download.html Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼學和會話
shiro身份驗證
hello nds 郵箱 使用 自己 ger logout 如果 art 身份驗證,即在應用中誰能證明他就是他本人。一般提供如他們的身份ID一些標識信息來表明他就是他本人,如提供身份證,用戶名/密碼來證明。 在shiro中,用戶需要提供principals (身份)和cre
Python tkinter 實現簡單登陸註冊 基於B/S三層體系結構,實現用戶身份驗證
cte cursor 實現簡單 結果 pass 分享圖片 not null for 技術 Python tkinter 實現簡單登陸註冊 最終效果 開始界面 ? 註冊 登陸 ? 源碼 login.py # encoding=utf-8 f
簡單安裝ELK分析日誌及使用心得
ELKELK是由Elasticsearch、Logstash、Kibana三個組件組成的。Elasticsearch:是ELK的核心插件,是一個基於Lucene的搜索服務器,它提供一個分布式多用戶能力的全文搜索引擎,能夠達到實時搜索,穩定,可靠,快速,安裝方便。Elasticsearch服務會開啟兩個端口,9
apache虛擬目錄的創建及身份驗證功能的開啟
test err mark 分享圖片 options ref lin conf 網頁 apache虛擬目錄的創建及身份驗證功能的開啟 實驗環境:服務端:centos6.5 IP192.168.10.10客戶端:win71.echo "test01" &g
MVC身份驗證及權限管理
font word 註入 方法 web應用 com 保存 account ipa 本文旨在簡單介紹mvc的權限驗證。 一、Forms認證 1、首先是建一個asp.net web應用程序 為了實現身份驗證,所以必須要添加一個登陸頁面,同時還需要有對應的用戶類型
關於ASP.NET MVC 5 的一種簡單的身份驗證方式:FormsAuthentication.Authenticate
在ASP.NET MVC 5中,身份驗證分別有三種方式。分別為使用FormsAuthentication、MemberShip和Identity進行驗證。 (PS:本系列的邏輯程式碼請勿直接用於生產,請自己多加一層抽象後再投入使用) 為了展示這三種方式,我們先新建一個MVC