shiro系列之shiro+mysql实现用户认证(authentication)(代码片段)

禹爸爸 禹爸爸     2022-12-05     487

关键词:

网上大多数介绍Apache Shiro的资料都是使用ini文件的简单配置为例,很少用讲到如何配合数据库来实现用户认证的。我也是刚刚开始接触Shiro,在这里介绍一个入门级别的Shiro+Mysql的配置方法,这个方法仅仅是个开始,并没有和Web,Spring,Mybatis等框架进行整合,后续我还会继续和大家分享我的学习过程及心得。

 

now we can start the things that we really care about.

 

数据库中创建一个用户表,字段可以很简单。

CREATE TABLE `sec_user` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `password` varchar(128) COLLATE utf8_bin DEFAULT NULL,
  `created_time` datetime DEFAULT NULL,
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

 在表中插入一条记录,用户名:chris.mao.zb@163.com,密码:cmao

 

在resources目录下创建一个ini文件,配置Shiro(后续文件会将此文件内容移至XML文件中)。在这个配置文件中我们要设置数据源,以及用户认证时使用数据库查询语句。这里用到了Shiro中自带的JdbcRealm类。

[main]  
dataSource=org.springframework.jdbc.datasource.DriverManagerDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://127.0.0.1:3306/YOUR_DATABASE_NAME
dataSource.username=YOUR_USERNAME
dataSource.password=YOUR_PASSWORD

jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = true  
jdbcRealm.dataSource=$dataSource
jdbcRealm.authenticationQuery = SELECT password FROM sec_user WHERE user_name = ?  

securityManager.realms=$jdbcRealm

关于用户认证的查询语句,我在这里多说两句,小伙伴们不要嫌我啰嗦。我们只需要以用户名为查询条件,查询出密码字段即可,如果您在select后面使用了星号(*)或是查询字段多于一个,都无法通过用户认证 。

配置文件写好后,我们就可以动手写个测试方法,来验证是否可以实现用户认证功能了。

 

package com.emerons.learning;

import static org.junit.Assert.*;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.DisabledAccountException;
import org.apache.shiro.authc.ExcessiveAttemptsException;
import org.apache.shiro.authc.ExpiredCredentialsException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class JdbcRealmTest 

	@Before
	public void setUp() throws Exception 
	

	@After
	public void tearDown() throws Exception 
	

	@Test
	public void test() 
		// 1.获取SecurityManager工厂,此处使用ini配置文件初始化SecurityManager
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini");
		// 2.获取SecurityManager实例,并绑定到SecurityUtils
		SecurityManager sm = factory.getInstance();
		SecurityUtils.setSecurityManager(sm);

		// 3.得到Subject
		Subject subject = SecurityUtils.getSubject();
		// 4.创建用户登录凭证
		UsernamePasswordToken token = new UsernamePasswordToken("chris.mao@emerson.com", "chrismao");
		// 5.登录,如果登录失败会抛出不同的异常,根据异常输出失败原因
		try 
			subject.login(token);
			// 6.判断是否成功登录
			assertEquals(true, subject.isAuthenticated());
			System.out.println("登录成功!!");
			// 7.注销用户
			subject.logout();
		 catch (IncorrectCredentialsException e) 
			System.out.println("登录密码错误. Password for account " + token.getPrincipal() + " was incorrect.");
		 catch (ExcessiveAttemptsException e) 
			System.out.println("登录失败次数过多");
		 catch (LockedAccountException e) 
			System.out.println("帐号已被锁定. The account for username " + token.getPrincipal() + " was locked.");
		 catch (DisabledAccountException e) 
			System.out.println("帐号已被禁用. The account for username " + token.getPrincipal() + " was disabled.");
		 catch (ExpiredCredentialsException e) 
			System.out.println("帐号已过期. the account for username " + token.getPrincipal() + "  was expired.");
		 catch (UnknownAccountException e) 
			System.out.println("帐号不存在. There is no user with username of " + token.getPrincipal());
		
	

 

运行测试代码,得到如下输出:

INFO : org.springframework.jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: com.mysql.jdbc.Driver
INFO : org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set.  Authorization cache cannot be obtained.
INFO : org.apache.shiro.config.IniSecurityManagerFactory - Realms have been explicitly set on the SecurityManager instance - auto-setting of realms will not occur.
INFO : org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Enabling session validation scheduler...
登录成功!!
INFO : org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set.  Authorization cache cannot be obtained.

 我们从日志上可以看到,程序加载了Jdbc驱动,明确指定了realm,这说明我们的Shiro配置文件加载成功。最后看到输出了“登录成功”说明这个认证功能已经实现了。大家也可以试着修改测试代码用的用户名或是密码,可以在控制台看到类似下面的输出,说明也可以抛出正确的异常。

INFO : org.springframework.jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: com.mysql.jdbc.Driver
INFO : org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set.  Authorization cache cannot be obtained.
INFO : org.apache.shiro.config.IniSecurityManagerFactory - Realms have been explicitly set on the SecurityManager instance - auto-setting of realms will not occur.
登录密码错误. Password for account chris.mao@emerson.com was incorrect.

 

至此,使用Shiro + Mysql实现用户认证(Authentication)的功能已经完成。大家可以在这个基础上,完善实现角色授权(Authroization),操作允可(Permission)等功能,参见《Shiro系列之Shiro+Mysql实现用户授权(Authorization) 

cas5.3.1系列之自定义shiro认证策略(代码片段)

CAS5.3.1系列之自定义Shiro认证策略(四)CAS官方文档是介绍基于配置实现shiro认证的,可以参考官方文档,不过我们也可以通过自定义认证策略的方式实现jdbc认证,pom先加入相关jar<!--CustomAuthentication--><dependency><groupId>... 查看详情

权限框架之shiro详解

...限管理  权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。  权限管理包括用户身份认证和授权两部分,简称认证... 查看详情

shiro教程-shiro介绍

shiro教程系列shiro教程(3)-shiro授权1 shiro介绍 1.1 什么是shiroShiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安... 查看详情

shiro教程-基于url权限管理

shiro教程系列shiro教程(2)shiro教程(3)shiro教程(4)一、权限管理1.1 什么是权限管理基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或... 查看详情

shiro实战系列之架构

 ApacheShiro的设计目标是通过直观和易于使用来简化应用程序安全。Shiro的核心设计体现了大多数人们是如何考虑应用程序安全的——在某些人(或某些事)与应用程序交互的背景下。  应用软件通常是基于用户背景情... 查看详情

springboot整合shiro实现登录认证与权限控制

本文首发于:https://antoniopeng.com用户角色权限数据库设计数据库这里以MySQL为例创建数据库所需表如下:user:用户表role:角色表perm:权限菜单表user_role:用户与角色关联的中间表role_prem:角色与权限菜单关联的中间表执行数据... 查看详情

springboot实现基于shiro安全框架的,配合thymeleaf模板引擎的用户认证和授权(代码片段)

SpringBoot实现基于shiro安全框架的,配合thymeleaf模板引擎的用户认证和授权,及其思路介绍和流程详解1用户、角色和权限的概念及关系2shiro安全框架部分基本功能2.1用户认证2.2用户授权3不同用户系统功能的差异性实现3.1准... 查看详情

shiro框架-----用来实现认证和授权的操作

                                      Shiro框架1.概念:shiro:是一个权限管理控制框架。主要提供了认证与授权的操作。    认证:用户得登录成功后才能访问页面。  ... 查看详情

springboot进阶之整合shiro鉴权框架(三)

...不开「基础知识」的铺垫。目前正在出一个SpringBoot长期系列教程,从入门到进阶,篇幅会较多~「大佬可以绕过~」如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot基础部分,对基本的使用有了初步的认识,... 查看详情

shiro实战系列之入门实战(代码片段)

一、什么是shiro?ApacheShiro是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。  ApacheShiro的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要这... 查看详情

springboot进阶之整合shiro鉴权框架(四)

...不开「基础知识」的铺垫。目前正在出一个SpringBoot长期系列教程,从入门到进阶,篇幅会较多~「大佬可以绕过~」如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot基础部分,对基本的使用有了初步的认识,... 查看详情

shiro安全框架之权限认证(授权)(代码片段)

...源。在权限认证中,最核心的三个要素是:权限,角色和用户;AuthorizationhasthreecoreelementsthatwereferencequiteabitinShiro:permissions,roles,andusers. 权限permissions,即操作资源的权利,比如访问某个 查看详情

shiro安全框架——快速入门登录拦截用户认证请求授权(代码片段)

...环境2.使用1.登录拦截 2.用户认证四、Shiro整合Mybatis五、实现请求授权六、Shiro整合Thymeleaf一、Shiro简介:ApacheSh 查看详情

[shiro]-怎样使用shiro?

...开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权,加密,会话管理等功能,组成一个通用的安全认证框架.为什么用它?使用shiro就可以非常快速地完成认证,授权等功能的开发,降低系统成本时间.shiro... 查看详情

shiro

...进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权管理两部分,简称认证授权... 查看详情

shiro中基于注解实现的权限认证过程

...拥有某一按钮的权限等等。  一、用户权限模型为实现一个较为灵活的用户权限数据模型,通常把用户信息单独用一个实体表示,用户权限信息用两个实体表示。用户信息用LoginAccount表示,最简单的用户信息可能只包含用... 查看详情

shiro

...进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授予的资源。权限管理包括用户认证和授权,简称认证授权。对于需要访问... 查看详情

springboot整合shiro+jwt实现认证及权限校验(代码片段)

序言本文讲解如何使用SpringBoot整合Shiro框架来实现认证及权限校验,但如今的互联网已经成为前后端分离的时代,所以本文在使用SpringBoot整合Shiro框架的时候会联合JWT一起搭配使用。ShiroShiro是apache旗下一个开源框架,... 查看详情