shiro1.13认证流程核心-非框架整合版本

本案例测试使用的是shiro1.13.0最新版本测试

1、shiro概述?

Apache Shiro是java的一个安全框架,能够实现:认证、授权、加密、会话管理、与Web集成、缓存等。

认证:本质就是判断你输入的用户名和密码跟数据库的是否相同。

授权:即访问控制,判断和控制谁对指定资源是否有访问权限。

2、shiro认证流程概述

1、当前端用户通过输入框输入用户名和密码的时候,后端获取数据后,会将用户名和密码封装成UsernamepasswordToken对象,并通过Subject.login(token);访问SecurityManager安全管理器。

2、SecurityManager安全管理器会将认证操作交给Authenticator(认证管理器),认证管理器会获取认证策略,如用户名和密码认证或者指纹认证登。

3、Authenticator将身份信息传递给Realm(这个Realm可以是系统自带的,也可以是用户自定义的,但是在实际的项目中肯定都是自定义的Realm)。这个Realm就是用来连接数据库验证数据是否正确的地方。

4、Realm认证后会将认证的结果返回给SecurityManager安全管理器,安全管理器会拿着这份数据与Subject中用户输入的数据比对,相同就验证成功,不同就验证失败。

3、shiro使用快速案例-非数据库版本

3.1、创建Maven工程导入shiro包信息

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>shirobasedemo1</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>shirobasedemo1</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-all --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.13.0</version><type>pom</type></dependency></dependencies>
</project>

3.2、在resources目录中创建shiro.ini配置文件

这个使用使用的是默认的realm,直接从配置文件获取用户名和密码

[users]
shiyilang=123456
shierlang=456789

3.3、创建测试类,测试验证结果

此处使用新版本的测试方式

新版本中直接通过IniRealm去访问和解析ini配置文件

public class Test {public static void main(String[] args) {//创建securityManager安全管理器DefaultSecurityManager securityManager= new DefaultSecurityManager();//创建IniRealmIniRealm iniRealm=new IniRealm("classpath:shiro.ini");//解析shiro.ini文件securityManager.setRealm(iniRealm);//将SecurityManager绑定到当前运行环境中,让系统随时随地可以访问securityManager对象SecurityUtils.setSecurityManager(securityManager);//创建当前的登录主体,此时主体没有经过认证(Subject会给SecurityManager委托各种功能)Subject subject= SecurityUtils.getSubject();//绑定主体登录的身份凭证,即账号和密码UsernamePasswordToken token=new UsernamePasswordToken("shiyilang","123456");//主体登录subject.login(token);//login方法的内部,就回去安全管理器//判断登录是否成功System.out.println("验证是否成功:"+subject.isAuthenticated());//注销操作subject.logout();System.out.println("验证是否成功:"+subject.isAuthenticated());}
}

3.4、测试结果

3.5、上述程序源码下载

https://download.csdn.net/download/tangshiyilang/88677731

4、shiro快速使用案例—创建JdbcRealm

当我们的验证不需要很复杂的时候,系统为了方便用户的使用,直接提供了一个封装好的Realm,我们可以快速的使用数据库的方式验证用户名和密码是否正确。

4.1、JdbcRealm功能概述

JdbcRealm会使用内置的SQL语句,所有必须保证用户表的表名必须为 users, 用户名必须为 username, 密码必须为 password 字段。 users 表不一定只有这两个字段,但必须要保证有这两个字段,如果想加盐加密,还需要有password_salt 字段。

JdbcRealm部分源代码分析

从下面的源代码可以看出,我们创建的表名必须叫users,表字段中必须使用username,password等。需要与源码中的内容相合。

public class JdbcRealm extends AuthorizingRealm {protected static final String DEFAULT_AUTHENTICATION_QUERY = "select password from users where username = ?";protected static final String DEFAULT_SALTED_AUTHENTICATION_QUERY = "select password, password_salt from users where username = ?";protected static final String DEFAULT_USER_ROLES_QUERY = "select role_name from user_roles where username = ?";protected static final String DEFAULT_PERMISSIONS_QUERY = "select permission from roles_permissions where role_name = ?";private static final Logger log = LoggerFactory.getLogger(JdbcRealm.class);protected DataSource dataSource;protected String authenticationQuery = "select password from users where username = ?";protected String userRolesQuery = "select role_name from user_roles where username = ?";protected String permissionsQuery = "select permission from roles_permissions where role_name = ?";protected boolean permissionsLookupEnabled = false;protected SaltStyle saltStyle;protected boolean saltIsBase64Encoded;
}

4.2、在MySQL中创建user表

CREATE TABLE `users` (`userid` varchar(30) DEFAULT NULL,`username` varchar(30) DEFAULT NULL,`useraddr` varchar(60) DEFAULT NULL,`userage` varchar(20) DEFAULT NULL,`PASSWORD` varchar(50) DEFAULT NULL,`password_salt` varchar(50) DEFAULT NULL,`STATUS` varchar(5) DEFAULT NULL,`remark` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*Data for the table `users` */insert  into `users`(`userid`,`username`,`useraddr`,`userage`,`PASSWORD`,`password_salt`,`STATUS`,`remark`) values 
('1001','雾林小妖','安徽合肥','30','123456',NULL,'1','有点小帅');

4.3、创建maven工程引入配置信息

核心是

shiro-all:我这里使用的是shiro1.13.0版本

mysql驱动包:我的数据库是mysql5.7版本,你可以使用自己版本对应的包版本。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>shirojdbcrealmdemo1</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>shirojdbcrealmdemo1</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.13.0</version><type>pom</type></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.4</version></dependency></dependencies>
</project>

4.4、创建JdbcRealm中数据源配置类

public class DataSourceUtil {public static DataSource getDataSource() throws SQLException {//创建连接池核心工具类ComboPooledDataSource dataSource=new ComboPooledDataSource();//设置连接参数:url,驱动,用户密码,初始连接数,最大连接数dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/shiro?useSSL=false&serverTimezone=UTC");dataSource.setDataSourceName("com.mysql.jdbc.Driver");dataSource.setUser("root");dataSource.setPassword("123456");dataSource.setInitialPoolSize(3);dataSource.setMaxPoolSize(6);dataSource.setMaxIdleTime(1000);return dataSource;}
}

4.5、创建测试类测试JdbcRealm

public class Test {public static void main(String[] args) throws SQLException {//创建securityManager安全管理器DefaultSecurityManager securityManager= new DefaultSecurityManager();//创建JdbcRealmJdbcRealm jdbcRealm=new JdbcRealm();//配置JdbcRealm连接数据库参数jdbcRealm.setDataSource(DataSourceUtil.getDataSource());//将Realm绑定到securityManagersecurityManager.setRealm(jdbcRealm);//将SecurityManager绑定到当前运行环境中SecurityUtils.setSecurityManager(securityManager);//创建当前的登录主体,此时主体没有经过认证(Subject会给SecurityManager委托各种功能)Subject subject= SecurityUtils.getSubject();//绑定主体登录的身份凭证,即账号和密码UsernamePasswordToken token=new UsernamePasswordToken("1001","1001");try{subject.login(token);//判断用户是否登录成功if(subject.isAuthenticated()){System.out.println("用户:"+token.getUsername()+", 登录成功");}}catch (Exception e) {e.printStackTrace();System.out.println("没有此账号");}//退出程序subject.logout();System.out.println("用户是否登录成功:"+subject.isAuthenticated());}
}

4.6、测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307471.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

售后客服日常回复必备的话术

致歉安抚通用 1.非常抱歉耽误您宝贵的时间了&#xff0c;这边给您查询一下&#xff0c;请稍等。 2.非常抱歉&#xff0c;给您添麻烦了。这边为您转接售后专员给您处理&#xff0c;请亲稍等。 3.影响到您的购物体验万分抱歉。 4.这边都会给您尽心解决的呢。 5.我非常理解您…

全新研发体系助力产品落地 传音控股成科技出海代表

一直以来&#xff0c;手机都被认为是所有新技术的最佳应用载体&#xff0c;尤其是在数字化、智能化时代&#xff0c;技术创新能力决定着手机厂商的生存与发展。 作为全球新兴市场手机行业的中坚力量之一&#xff0c;传音控股始终坚持以技术创新为驱动&#xff0c;围绕用户需求…

Airtest+Poco多设备并发自动化游戏测试框架(遇到的问题)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Google Play上架:2023年度总结报告

今天是2023年的最后一个工作日&#xff0c;今天用来总结一下2023年关于谷歌商店上架的相关政策改动和对应的拒审解决方法。 目录 政策更新与改动2023 年 2 月 22 日2023 年 4 月5 日2023 年 7 月 12 日2023 年 10 月 25 日 开发者计划政策拒审邮件内容和解决办法 政策更新与改…

Shell脚本-bin/bash: 解释器错误: 没有那个文件或目录-完整路径执行-“/”引发的脑裂

引起该不适的一种可能以及解决方案&#xff0c;网上较多&#xff0c;比如&#xff1a; 但按以上方式操作&#xff0c;并经过查看&#xff0c;发现仍然未能解决问题。 因为两种方式执行&#xff0c;有一种能成功&#xff0c;有一种不能&#xff0c;刚开始未怀疑是文件问题&…

进程

进程 进程的概念、组成与特征进程的状态与转换进程控制进程通信 进程的概念、组成与特征 程序是静态的&#xff0c;是一个存放在磁盘里的可执行文件&#xff0c;是一系列的指令集合。 进程是动态的&#xff0c;是程序的一次执行过程&#xff0c;同一个程序多次执行会对应多个进…

自定义View绘制基础之Canvas

画布Canvas Canvas&#xff08;画布&#xff09;是一个用于绘制图形的重要类&#xff0c;它提供了一组绘图操作的方法&#xff0c;允许你在屏幕上绘制各种形状、图像和文本。下面是Canvas类的主要函数&#xff1a; 目录 一、绘制图形和图像 1.drawColor 2.drawCircle 3.dr…

方案:智能分析网关V4区域人数超员AI算法模型的应用场景介绍

视频AI智能分析技术已经深入到人类生活的各个角落&#xff0c;与社会发展的方方面面紧密相连。从日常生活中的各种场景&#xff0c;如人脸识别、车牌识别&#xff0c;到工业生产中的安全监控&#xff0c;如工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品…

一篇文章掌握 NestJS 所有的生命周期以及生命周期的执行时机

前言 NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架&#xff0c;它使用 TypeScript 作为开发语言&#xff0c;也支持原生的 JavaScript。在 NestJS 中&#xff0c;生命周期事件是一个重要的概念。在我们构建和管理应用程序时&#xff0c;有时需要在特定…

【数据结构】C语言实现双链表的基本操作

双链表及其基本操作的实现 导言一、单链表与双链表二、双链表类型的创建三、双链表的初始化四、双链表的创建五、双链表的遍历六、双链表的查找七、双链表的插入八、双链表的删除结语 导言 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 经过…

全方面了解vcruntime140_1.dll的解决方法,多种vcruntime140_1.dll丢失的方法

在日常使用电脑时&#xff0c;我们常常遇到各种各样的问题。其中之一就是丢失vcruntime140_1.dll文件&#xff0c;这是一个重要的系统文件&#xff0c;会影响到电脑的正常运行。今天小编就来给大家详细的说说这一方面的咨询&#xff0c;教会大家多种的丢失vcruntime140_1.dll的…

文件销毁 硬盘销毁 数据销毁:护航数据安全的最后一公里

希望与业界各位志同道合的伙伴交流切磋最新的网络、服务器行业动态信息&#xff0c;同时分享腾讯在网络与服务器领域&#xff0c;规划、运营、研发、服务等层面的实战干货&#xff0c;期待与您的共同成长。 网络平台部以构建敏捷、弹性、低成本的业界领先海量互联网云计算服务…