01-Shiro的入门程序-认证(ssm+Shiro)

一、创建Java Project

  jar包:

  

二、创建ini文件,shiro-first.ini

# 对用户信息进行配置,这个文件相当于数据源、数据库
[users]
# 用户名和密码
Peter=111111
Tom=222222

三、创建测试类 AuthenticationTest.java

package cn.itcast.shiro.authentication;

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

// 认证测试
public class AuthenticationTest {
	// 登录和退出
	@Test
	public void testLoginAndLogout() {
		// 创建SecurityManager工厂
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini");
		
		// 获取SecurityManager
		SecurityManager securityManager = factory.getInstance();
		
		// 将securityManager设置到运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		// 创建Subject,这个就是从数据库中获取的正确的主体,包含用户名和凭证(如密码、数字签名、指纹等等)
		Subject subject = SecurityUtils.getSubject();
		
		// 创建Token,这个token就是用户输入的用户名和密码做成的token令牌,将来要从数据库中获取
		UsernamePasswordToken token = new UsernamePasswordToken("Peter", "111111");
		
		// 认证提交,认证不通过时会报异常
		try {
		    subject.login(token);
		} catch (AuthenticationException e) {
		    e.printStackTrace();
		}
		
		// 认证结果:认证通过放回true,失败返回false
		boolean isAuthenticated = subject.isAuthenticated();
		// 打印认证结果
		System.out.println("认证结果:" + isAuthenticated);
		
		// 退出操作
		subject.logout();
		
		// 再次打印认证结果
		boolean isAuthenticatedAfterLogout = subject.isAuthenticated();
		System.out.println("认证结果:" + isAuthenticatedAfterLogout);
	}
}

工程结构:

    

四、运行结果

(1)输入正确的用户名和密码,返回true;

(2)输入错误的用户名,不管密码对不对,都报异常:org.apache.shiro.authc.UnknownAccountException

(3)输入正确的用户名,错误的密码,报异常:org.apache.shiro.authc.IncorrectCredentialsException

(4)如果中间插入logout(),认证结果是false

--------------------------------------------------------------------------------------

认证过程:(追溯shiro源码)

1、创建token令牌,token中有用户提交的认证信息即账号和密码
2、执行subject.login(token),最终由securityManager通过Authenticator进行认证
3、Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带)
4、IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

--------------------------------------------------------------------------------------

常见的异常:

UnknownAccountException:账号错误

IncorrectCredentialsException:凭证错误

DisabledAccountException:帐号被禁用

LockedAccountException:帐号被锁定

ExcessiveAttemptsException:登录失败次数过多

ExpiredCredentialsException:凭证过期

 

posted @ 2017-07-23 11:55  半生戎马,共话桑麻、  阅读(306)  评论(0)    收藏  举报
levels of contents