1. 程式人生 > >Shiro處理簡單的身份驗證的分析及例項

Shiro處理簡單的身份驗證的分析及例項

在兩天在看Shiro,開濤兄的教程還是寫的比較易讀,差不多看了一天吧,就準備拿來用了。
可能是想的太簡單了,在用的時候確實碰到一些問題,就拿最簡單的身份驗證來說吧:
需要說明的是,這裡是整合在Spring中使用,身份驗證我直接使用了Shiro提供的

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

如果url應用了該攔截器,那麼處理流程是大致這樣的:
這裡寫圖片描述
由於之前用markdown花的流程圖顯示不下,所以還是改成圖片形式了。

比如我們要用FormAuthenticationFilter來做一個簡單的身份驗證的話,也是很簡單的:

  1. 首先我們分別寫好處理登陸的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