shiro 认证

身份认证概念:
即在应用中谁能证明他就是他本人。一般提供如他们的身份ID 一些标识信息来
表明他就是他本人,如提供身份证,用户名/密码来证明。
在shiro 中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能
验证用户身份:

principals :
即用户名,在用户数据中起到唯一标识的字段
credentials:
即用户对应的密码,可以使数字证书、密码等
认证流程:
在这里插入图片描述
damo:
1、环境
eclipse
2、新建一个Java项目
3、导入包/项目结构
在这里插入图片描述
4、编写ini文件

[users]
zhangsan=1111

5、配置log4j.properties

log4j.rootCategory=INFO, CONSOLE ,LOGFILE

log4j.logger.com.bjsxt.mapper=DEBUG

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %d{YYYY-MM-dd hh:mm:ss}  %m %n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=E:/my.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%m %n

6、编写AuthenticationDemo.java

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
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;

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);
		//通过SecurityUtils获取subject
		Subject subject = SecurityUtils.getSubject();
		System.out.print(subject+"\n");
		//这里是登录时用户填写的用户名和密码
		//shiro里存放的是系统中用户的信息,也可以存放到数据库中
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","13111");
		//进行登录认证
		try {
			subject.login(token);
			//subject.isAuthenticated()判断是否登录成功,若是不成功会报错
			if(subject.isAuthenticated()) {
				System.out.print("登录成功\n");
			}
		} catch (UnknownAccountException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.print("用户或者密码不正确\n");
		} catch (IncorrectCredentialsException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.print("用户或者密码不正确\n");
		}
	}
}

运行结果:
在这里插入图片描述
shiro认证流程分析:
1、通过shiro api ,创建SecurityManager及获取subject实例。
2、通过UsernamePasswordToken 封装token信息。
3、通过subject.login(token)进行用户认证。
3.1、subject接收token,通过其实现类DelegatingSubjuct将token委托给SecurityManager来完成认证。
在这里插入图片描述
在这里插入图片描述
3.2、SecurityManager是接口通过DefaultSecurityManager来完成认证功能
在这里插入图片描述
CachingSecurityManager:缓存相关类
RealmSecurityManager:Realm相关类
AuthenticatingSecurityManager:认证相关类
AuthorizingSecurityMavager:授权相关类
SesionsSecurityManager:会话相关类
DefaultWebSecurityManager:通过继承以上类得到了相关的功能,shiro默认使用DefaultWebSecurityManager进行认证。

3.3、DefaultWebSecurityManager用login方法来完成认证过程,login又调用了authenticate()来完成认证,该方法是由AuthenticatingSecurityManager来完成的。

在这里插入图片描述
在这里插入图片描述
3.4、authenticate()通过调用authenticator(认证器)来完成认证。
在这里插入图片描述
3.5、authenticator是一个接口,authenticator是由默认实现类ModularRealmAuthenticator来完成认证。通过ModularRealmAuthenticator中的doAuthenticate来获取Realms信息,如果是单realm直接将token和realm中的数据进行比较,判断是否认证成功。如果是多realm那么需要通过Authentication Strategy 来完成对应的认证工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值