Shiro(二)——Shiro认证入门案例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34598667/article/details/84639985

1)新建maven项目shiro_test,导入jar包

在这里插入图片描述
在这里插入图片描述
下面是jar包的坐标:

<dependencies>
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-core</artifactId>
		<version>1.2.3</version>
	</dependency>
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.1.3</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.6.4</version>
	</dependency>
	<dependency>
		<groupId>commons-beanutils</groupId>
		<artifactId>commons-beanutils</artifactId>
		<version>1.9.2</version>
	</dependency>
</dependencies>

2)Shiro认证流程

在这里插入图片描述


3)创建shiro-first.ini

在classpath下创建shiro-first.ini,通过此配置文件创建securityManager工厂。

#对用户信息进行配置
[users]
#用户账号和密码
admin=123

4)测试认证入门案例

public class AuthenticationTest {

	@Test
	public void testLoginAndLogout(){
		//1、创建securityManager工厂,通过ini配置文件创建securityManager工厂
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-first.ini");
		
		//2、创建SecurityManager
		SecurityManager securityManager=factory.getInstance();
		
		//3、将securityManager设置到当前运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		//4、从SecurityUtils里边创建一个subject
		Subject subject = SecurityUtils.getSubject();
		//5、在认证提交前准备token(令牌)
		UsernamePasswordToken token=new UsernamePasswordToken("admin","1123");
		
		//6、执行认证提交--认证失败会抛异常
		subject.login(token);
		
		//是否认证通过
		boolean isAuthenticated =subject.isAuthenticated();
		System.out.println("是否认证通过:"+isAuthenticated);
		//退出操作
		subject.logout();
		//是否认证通过
		isAuthenticated=subject.isAuthenticated();
		System.out.println("是否认证通过:"+isAuthenticated);
	}
}

注意:如果认证失败则会排除两个异常,一是账号不一致会抛出(org.apache.shiro.authc.UnknownAccountException),二是密码不一致会抛出(org.apache.shiro.authc.IncorrectCredentialsException)
下面会详细讲解过程。


5)执行流程

  1. 通过ini配置文件创建securityManager
  2. 调用subject.login方法主体提交认证,提交的token
  3. securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证
  4. ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息
  5. IniRealm根据输入的token(UsernamePasswordToken)从 shiro-first.ini查询用户信息,根据账号查询用户信息(账号和密码)
    1. 如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
    2. 如果查询不到,就给ModularRealmAuthenticator返回null
  6. ModularRealmAuthenticator接收IniRealm返回Authentication认证信息
    1. 如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException)
    2. 如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)和 token中的密码 进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)

6)自定义realm

realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null。这里我们使用自定义reaml来完成此案例

1)编写自定义realm

自定义realm需要继承AuthorizingRealm抽象类,实现其中的抽象方法:

public class CustomRealm extends AuthorizingRealm{
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		//token是用户输入的
		//1、从token中取出身份信息
		String userCode=(String) token.getPrincipal();
		//2、根据用户输入的userCode从数据库查询
		//假设数据库用户是admin
		//如果查询不到则返回null
		/*if(!userCode.equals("admin")){
			return null;
		}*/
		//模拟从数据库查到密码
		String pwd="123";
		//如果查询到则返回认证信息AuthenticationInfo
		SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(
				userCode,pwd,this.getName());
		return simpleAuthenticationInfo;
	}
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(
			PrincipalCollection principals) {
		return null;
	}
}

2)配置realm

在classpath下新建shiro-realm.ini,在其中配置realm注入到securityManager中

[main]
#自定义realm
customRealm=com.oak.shiro.CustomRealm
#将realm设置到securityManager,相当于Spring注入
securityManager.realms=$customRealm

3)修改test中创建securityManager工厂的配置文件

//创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-realm.ini");

4)测试即可


下一章讲解Shiro授权入门案例

猜你喜欢

转载自blog.csdn.net/qq_34598667/article/details/84639985