shiro学习二

shiro的认证流程:

示例代码:

	//realm测试
	@Test
	public void testCustomerRealm(){
		// 创建securityManager工厂,通过ini配置文件(realm配置信息)创建securityManager工厂,在realm中,从数据库查询身份信息
		Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");
		
		//创建SecurityManager
		org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
		
		//将securityManager设置当前的运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		//从SecurityUtils里边创建一个subject
		Subject subject = SecurityUtils.getSubject();
		
		//在认证提交前准备token(令牌)
		//这里的用户名和密码是由用户输入进去的
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "11111");

		try {
			//执行认证提交,会跳转到自定义的realm中进行认证
			subject.login(token);
		} catch (AuthenticationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//是否认证通过
		boolean isAuthenticated =  subject.isAuthenticated();
		
		System.out.println("是否认证通过:" + isAuthenticated);
	}

执行流程:

1、通过ini配置文件创建securityManager

2、调用subject.login方法主体提交认证,提交的token

3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。

4、ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息

5、默认使用IniRealm(可以自定义配置realm)根据输入的token(UsernamePasswordToken)从 shiro-first.ini查询用户信息,根据账号查询用户信息(账号和密码)

         如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)

         如果查询不到,就给ModularRealmAuthenticator返回null

6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息

         如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException

         如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)和 token中的密码 进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException

  注意:

ModularRealmAuthenticator作用进行认证,需要调用realm查询用户信息(在数据库中存在用户信息)

ModularRealmAuthenticator进行密码对比(认证过程)

realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null。

 

 

posted @ 2017-08-03 21:06  九三x  阅读(143)  评论(0编辑  收藏  举报