Shiro入门(三)Shiro异常和JdbcRealm

news/2024/7/8 7:29:52

前言

      本章讲解Shiro的异常和JdbcRealm的相关知识

方法

1.回顾

在之前,我们完成了shiro的登陆验证,不知道大家有没有试过写错密码或者用户名会出现什么情况?

是会出现诸如“用户登陆失败!”的字眼吗?显然不是的!!他将会抛出异常。

还有,我们是通过在shiro配置文件中配置users来进行用户的认证,那么大多数情况下,我们都是在数据库中进行比对,验证登录。那么如何来使用数据库表中的数据来做登录的认证呢?接下来将会讲到这个问题。

2.Shiro异常

在Shiro中,异常分为如下几类:

总的异常为:AuthenticationException:认证异常

AuthenticationException又分为两大异常:AccountException:账户异常,CredentialsException:凭证异常,UnsupportedTokenException:不支持的Token异常

AccountException:

  • ConcurrentAccessException:并发访问异常,如多个用户一起访问
  • DisabledAccountException:不可用的账号异常,它的下面还有一个子类(LockedAccountException 账户锁定异常)
  • ExcessiveAttemptsException :认证次数过多异常
  • UnknownAccountException :未知账号异常

CredentialsException:

  • IncorrectCredentialsException:凭证错误异常
  • ExpiredCredentialsException:凭证过期异常

综上所述:我们需要使用try-catch进行异常的捕获,更改之前的代码如下:

package cn.edu.ccut.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.apache.shiro.mgt.SecurityManager;

/**
 * @Auther:jwang
 * @Date:2019/5/8
 * @Description:cn.edu.ccut.test
 * @Version 1.0
 **/
public class Authentication {

    public static void main(String [] args){
        //创建SecurityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //通过SecurityManager工厂获取SecurityManager实例
        SecurityManager securityManager = factory.getInstance();
        //将SecurityManager对象设置到运行环境中
        SecurityUtils.setSecurityManager(securityManager);
        //通过SecurityUtils获取主体Subject
        Subject currentUser = SecurityUtils.getSubject();
        //假设传入的用户名密码为admin和123
        UsernamePasswordToken token = new UsernamePasswordToken("admin", "1231");
        //进行用户身份验证
        try {
            currentUser.login(token);
            //如果用户认证成功
            if (currentUser.isAuthenticated()) {
                System.out.println("用户登录成功!");
            }
        }catch (AuthenticationException e){
            System.out.println("用户登录失败!");
        }

    }
}

可见,我们输入了错误的密码,执行结果如下:

3.JdbcRealm

回忆一下这个图片,我们知道shiro给我们提供了很多的Realms来进行用户的校验,本次我们就学习其中的JDBC Realm

观察org.apache.shiro.realm.jdbc.JdbcRealm类我们知道,要想进行Jdbc验证,我们需要创建users表,并且其中username、password、password_salt字段是必不可少的!

上面的图片是 JdbcRealm.java源码的部分,其中写死了一些SQL。

1)创建指定的表和字段

2)配置shiro.ini文件

首先,我们需要引入JdbcRealm

 

我们进入JdbcRealm源码中可以发现,其需要一个数据源。

 

这里我们只要使用市面上常用的连接池就可以了,我这里使用c3p0连接池了。

引入c3p0和oracle驱动相关的jar包:

 

配置文件更改为如下:

 

3)编写Java测试代码

package cn.edu.ccut.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.apache.shiro.mgt.SecurityManager;

/**
 * @Auther:jwang
 * @Date:2019/5/8
 * @Description:cn.edu.ccut.test
 * @Version 1.0
 **/
public class Authentication {

    public static void main(String [] args){
        //创建SecurityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //通过SecurityManager工厂获取SecurityManager实例
        SecurityManager securityManager = factory.getInstance();
        //将SecurityManager对象设置到运行环境中
        SecurityUtils.setSecurityManager(securityManager);
        //通过SecurityUtils获取主体Subject
        Subject currentUser = SecurityUtils.getSubject();
        //假设传入的用户名密码为admin和123
        UsernamePasswordToken token = new UsernamePasswordToken("sa", "sa");
        //进行用户身份验证
        try {
            currentUser.login(token);
            //如果用户认证成功
            if (currentUser.isAuthenticated()) {
                System.out.println("用户登录成功!");
            }
        }catch (AuthenticationException e){
            System.out.println("用户登录失败!");
        }

    }
}

测试结果如下:

注意观察,我们使用了users表中的一行数据 :sa/sa

可见,我们成功的实现了JdbcRealm! 


http://www.niftyadmin.cn/n/2757440.html

相关文章

bzoj 2434 fail tree+dfs序

首先比较明显的是我们可以将字符串组建立ac自动机&#xff0c;那么对于询问s1字符串在s2字符串中出现的次数&#xff0c;就是在以s1结尾为根的fail tree中&#xff0c;子树有多少个节点是s2的节点&#xff0c;这样我们处理fail tree的dfs序&#xff0c;然后用BIT维护&#xff0…

JNDI解读(转)

NDI 是什么 JNDI是 Java 命名与目录接口&#xff08;Java Naming and Directory Interface&#xff09;&#xff0c;在J2EE规范中是重要的规范之一&#xff0c;不少专家认为&#xff0c;没有透彻理解JNDI的意义和作用&#xff0c;就没有真正掌握J2EE特别是EJB的知识。 那么&…

Shiro入门(四)Shiro登录验证源码及策略

前言 本章讲解Shiro登录验证的源码剖析以及登录验证策略 方法 一、Shiro登陆验证源码解析 1.使用Subject的login方法验证token 2.实际上Subject类仅仅是一个接口&#xff0c;他通过实现类DelegatingSubject将token委托给SecurityManager 来完成验证 3.而SecurityManager作为…

OCM考点之一外部表管理

一、创建外部表以及产生dmp文件1、创建directory&#xff0c;需要有 create any directory权限&#xff1a;CREATE DIRECTORY admin AS /oracle/admin; 或者创建了diretory后授权read权限&#xff1a;GRANT READ ON DIRECTORY admin TO scott; 2、创建外部表&#xff1a;SQL&…

《从零开始学Swift》学习笔记(Day 56)—— Swift编码规范之命名规范

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;关东升的博客 程序代码中到处都是自己定义的名字&#xff0c;取一个有样并且符合规范的名字非常重要。命名方法很多&#xff0c;但是比较有名的&#xff0c;广泛接受命名法有&#xff1a;匈牙利命名&#xff0c;一般只是命…

《流量的秘密 Google Analytics网站分析与商业实战》一1.6 有问有答:衡量成功...

本节书摘来自异步社区《流量的秘密 Google Analytics网站分析与商业实战》一书中的第1章&#xff0c;第1.6节&#xff0c;作者 【英】Brian Clifton&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 有问有答&#xff1a;衡量成功 http://trends.builtwit…

《途客圈创业记:不疯魔,不成活》一一2.7 愿景和使命

本节书摘来自异步社区出版社《途客圈创业记&#xff1a;不疯魔&#xff0c;不成活》一书中的第2章&#xff0c;第2.7节&#xff0c;作者&#xff1a;陈天&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.7 愿景和使命 初始的团队组建起来了&#xff0c;我…

从明星扎堆转型互联网 看内容草根时代的结束

在互联网时代&#xff0c;与其说“得屌丝者得天下”&#xff0c;不如说这是一个由千千万万草根支撑起来的繁华时代。作为占据互联网参与者最重要的组成部分&#xff0c;草根此前承担着两大重任。一是内容创造&#xff0c;为互联网不断输入多个领域的内容和信息&#xff1b;另一…