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;
    }

可改写为

    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:
        initCustomSessionAttributes(request.getSession(false));
        return false;
    }

最后给出Shiro中常见的验证不通过报的错误:

  • DisabledAccountException (禁用的帐号)
  • LockedAccountException (锁定的帐号)
  • UnknownAccountException(错误的帐号)
  • ExcessiveAttemptsException(登录失败次数过多)
  • IncorrectCredentialsException (错误的凭证)
  • ExpiredCredentialsException (过期的凭证)
  • ……
时间: 2024-10-31 01:51:12

Shiro处理简单的身份验证的分析及实例的相关文章

shiro 简单的身份验证 案例

Apache Shiro是Java的一个安全框架,Shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等. 简单的身份验证 项目目录: 首先,在shiro.ini里配置了用户名和密码  用户名为 hello 密码为 123 项目使用了maven 在pom.xml中添加所需要的依赖 SayHello.java package com.shiro; import org.apache.shiro.SecurityUtils; import org.apache.shiro.au

将最小的OWIN身份验证添加到现有的ASP.NET MVC应用程序

https://weblog.west-wind.com/posts/2015/Apr/29/Adding-minimal-OWIN-Identity-Authentication-to-an-Existing-ASPNET-MVC-Application 将最小的OWIN身份验证添加到现有的ASP.NET MVC应用程序 2015年4月29日•来自毛伊岛,HI•    40条评论 从ASP.NET 4开始,ASP.NET提供了一个相当有用的身份系统.如果您创建一个新项目并选择一个MVC项目并选

无password身份验证:安全、简单且部署高速

Passwordless authentication: Secure, simple, and fast to deploy [编者按]本文作者为 Florian Heinemann 与 Robert Nyman. Florian 来自 MIT 系统设计与管理学院,专注于复杂的社交技术系统.此前曾在企业软件领域的多家初创公司工作,之后加入 Airbus,担任知识与创新管理经理一职.Robert 是 Mozilla Hacks 技术传道师及编辑.曾就 HTML5,JavaScript 以及 Op

Shiro学习笔记(2)——身份验证之Realm

环境准备 什么是Realm 为什么要用Realm 自定义Realm 多个Realm 配置Authenticator和AuthenticationStrategy 自定义AuthenticationStrategy验证策略 多个Realm验证顺序 环境准备 创建java工程 需要的jar包 大家也可以使用maven,参考官网 什么是Realm 在我所看的学习资料中,关于Realm的定义,写了整整一长串,但是对于初学者来说,看定义实在是太头疼了. 对于什么是Realm,我使用过之后,个人总结一下:s

Shiro 学习笔记(二)——shiro身份验证

身份验证: 在应用中证明他就是他本人.一般上用身份证.用户/密码 来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份 Principals: 身份,即主体的标识属性,只要是主体的

第二章 身份验证——《跟我学Shiro》

身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份: principals:身份,即主体的标识属性,可以是任何东西,如用户名.邮箱等,唯一即可.一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号. credentials:证明

Github官方app分析——用户身份验证模块

这篇文章记述的是我对Giuhub官方app的用户身份验证模块的分析. Giuhub的官方app虽然是一个非常小众的程序,但是从程序的设计的角度看,这是一个非常优秀的项目.对于其用户身份验证模块,给我留下的印象更是非常深刻.如果你对此有兴趣,请移步到我的blog,地址如下: 地址: http://kohoh1992.github.io/GithubAppAccountAuthenticatorAnalysis/ 哦,对了.忘记补充了,这里的文章全部都是我个人blog上的副本.如果你对我的blog有

cas+shiro实现不时时的去请求cas进行身份验证

cas+shiro不进行时时去cas验证身份信息,需要用shiro在当前系统有一份完整的认证机构. 那么有一个问题,什么时候去cas校验信息,目前的配置方式: cas系统设置默认的浏览器session存活时间,当前系统的session存活时间为30分钟,那么当当前系统身份验证失败是,去cas校验. 这里涉及到一个非常重要的节点,就是shiro框架内部是怎么进行cas校验的呢,请看代码: org.apache.shiro.web.filter.AccessControlFilterd还是所有默认验

Shiro:学习笔记(1)——身份验证

Shiro--学习笔记(1) 1.核心概念 1.Shiro不会自己去维护用户.维护权限:这些需要我们自己去设计/提供:然后通过相应的接口注入给Shiro.2.应用代码直接交互的对象是Subject,也就是说Shiro的对外核心是Subject: Subject:主体,代表了当前用户,不一定是一个具体的人,与当前交互的任何东西都是Subject,如网络爬虫.机器人等,是一个抽象概念.所有的Subject都会绑定到SecurityManager.可以把Subject认为是一个门面:SecurityM