Shrio学习笔记(二)

Authentication身份验证

是对身份进行检查的过程,即核实某个"User"是不是其本人。

一些名词:

Subject主体:从安全角度来看的"User",可能是真实的某个人的账户,也可能是第三方的一个进程,即任何与我们自己的程序进行通讯并需要进行认证的主体。

Principals身份:指Subject的唯一可识别属性,一般指用户名、身份证号、邮箱等。

Credentials凭证:用于核实Principals的安全数据,一般指密码。

Realm安全数据源:DAO或与后台通讯的其他软件组件,通过realm来来获取安全实体,可以有多个。

身份验证三步曲:

1. 收集主体的身份及凭证,一般指用户名和密码。

2. 提交身份及凭证进行验证。

3. 验证成功或失败或重新提交验证

一个例子:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Assert;
import org.junit.Test;

public class UsernamePasswordTest {
	
		@Test
		public void test(){
			//待验证的用户名和密码,可能是从web表单post过来的数据
			String username = "zhangsan";
			String password = "abcd123";
			
			/* UsernamePasswordToken最常用的用户名和密码验证机制,
			   a. 实现了HostAuthenticationToken,用于获取提交验证者的主机名和IP地址
			   b. 实现了RememberMeAuthenticationToken,支持“RememberMe”服务,默认关闭状态,
			      如果接下来的SecurityManager也支持此服务,则用户的身份将会记录在session中。			
			 */			
			UsernamePasswordToken token = new UsernamePasswordToken(username,password);			
			//token.setRememberMe(true);			
			
			//通过ini文件建立Realm
			IniRealm iniRealm = new IniRealm("classpath:users.ini");			
			DefaultSecurityManager dsm = new DefaultSecurityManager();
			dsm.setRealm(iniRealm);			
			SecurityUtils.setSecurityManager(dsm);
						
			Subject subject = SecurityUtils.getSubject();			
			try {
				subject.login(token);
			} catch (AuthenticationException e) {
				System.out.println("用户登录失败!");
				//e.printStackTrace();
			} 			
			Assert.assertEquals(true,subject.isAuthenticated());//断言用户已登录
			System.out.println("用户登录成功!");
			subject.logout();			
			
		}
}

注:需提前在类路径下建立一个users.ini文件,内容如下:

[users]
zhangsan=abcd1234
lisi=efgh5678




你可能感兴趣的:(shiro,Authentication)