shiro(二)基础案例身份认证

shiro认证(二)

2.1 基本概念

2.1.1 身份验证
在 shiro 中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份:
2.1.2 principals
身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。
一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号。
2.1.3 credentials
证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
最常见的principals和credentials组合就是用户名/密码了。接下来先进行一个基本的身份认证。

2.2 认证流程

在这里插入图片描述

2.3 入门程序(用户验证)

2.3.1创建java工程
2.3.2 加入相关jar包

在这里插入图片描述
2.3.3 log4j.properties日志配置文件

log4j.rootLogger=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n

2.3.4 配置shiro环境文件shiro.ini

[users]
zhangsan=123
lisi=456

2.3.5 代码实现

package com.sxt.shiro;

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

/**
 * 完成用户认证demo
 * @author Lee
 *
 */
public class AuthenticationDemo {
	public static void main(String[] args) {
		//1.创建获取 SecurityManager 工厂,读取相应配置文件
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
		//2.通过SecurityManager工厂获取SecurityManager的实例
		SecurityManager securityManager = factory.getInstance();
		//3.将SecurityManager对象设置到运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		//4.通过SecurityManager主体获取Subject
		Subject subject = SecurityUtils.getSubject();
		//5.假如登录的用户名zhangsan和123,这个地方的zhangsan和123表示用户登录时输入的信息
		//而shiro.ini文件中信息相当于数据库中存放的用户信息
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123");
		//进行用户身份验证
		subject.login(token);
		//通过subject来判断用户是否通过验证
		if(subject.isAuthenticated()){
			System.out.println("用户登录成功!!!");
		}else{
			System.out.println("用户名或密码错误!!!!!");
		}
	}
}

上面代码块中下方的if、else判断语句不会执行else中的代码块。因为subject.login()方法中时判断用户的账号和密码,如果账号和密码不正确就会抛出异常,就不会执行if、else语句。
2.4.1、首先通过 new IniSecurityManagerFactory 并指定一个 ini 配置文件来创建一个
SecurityManager 工厂;
2.4.2、接着获取 SecurityManager 并绑定到 SecurityUtils,这是一个全局设置,设置一次即可;
2.4.3、通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程;如果在 web 环境在请求结
束时需要解除绑定;然后获取身份验证的 Token,如用户名/密码;
2.4.4、调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录;
2.4.5 、 如 果 身份验证 失败请捕 获 AuthenticationException 或 其 子 类 , 常 见 的 如 :
DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、
UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过
多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的
凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如“用户名/密码
错误”而不是“用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;
2.4.6、最后可以调用 subject.logout 退出,其会自动委托给 SecurityManager.logout 方法退出。
从如上代码可总结出身份验证的步骤:
1、收集用户身份/凭证,即如用户名/密码;
2、调用 Subject.login 进行登录,如果失败将得到相应的 AuthenticationException 异常,根
据异常提示用户错误信息;否则登录成功;
3、最后调用 Subject.logout 进行退出操作。
如上测试的几个问题:
1、用户名/密码硬编码在 ini 配置文件,以后需要改成如数据库存储,且密码需要加密存储;
2、用户身份 Token 可能不仅仅是用户名/密码,也可能还有其他的,如登录时允许用户名/
邮箱/手机号同时登录。

2.5 异常处理及认证流程

常见的异常信息及处理,在认证过程中有一个父异常为AuthenticationException。
在这里插入图片描述
该异常有几个子类,分别对应不同的异常情况:
a):DisabledAccountException 账户失效异常
b):ExcessiveAttemptsException 尝试次数过多
c):UnknownAccountException 用户不正确
d):ExpiredCredentException 凭证过期异常
e):IncorrectCredentialsException凭证不正确

虽然shiro为每一种异常都提供了准确的异常类,但是在编写代码过程中,应提示给用户的信息是模糊的。这样有助于安全。常见的处理方式为:

try {
			//进行用户身份验证
			subject.login(token);
			//通过subject来判断用户是否通过验证
			if(subject.isAuthenticated()){
				System.out.println("用户登录成功!!!");
			}
		} catch (UnknownAccountException e) {
			System.out.println("用户名或密码不正确!!!!!!");
		}
		catch (IncorrectCredentialsException e) {
			System.out.println("用户名或密码不正确!!!!!!");
		}

执行流程:

通过shiro相关api,创建securityManager及获取subject实例
封装token信息
通过subject.login(token)进行用户认证。
subject接受token,通过其实现类DelegatingSubject将token委托给securityManager来完成认证。securityManager是接口通过DefaultSecurityManager来完成相关的功能。由DefaultSecurityManager中login()来完成认证过程。在login中调用了该类authentication()来完成认证。该authentication()方法是由AuthenticatingSecurityManager来完成的。在该类的authenticate()中,通过调用authenticator(认证器)来完成认证工作。Authenticator是由其默认实现类ModularRealmAuthenticator来完成认证。通过ModularRealmAuthenticator中的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值