自定义Realm实现认证


一般自定义Realm继承AuthorizingRealm接口,当执行subject.login()时,程序就会将token传到自定义的Realm


package com.mo.shiro.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 
 *	这是一个Realm
 *
 */
public class CustomRealm extends AuthorizingRealm  {

	
	//设置CustomRealm的名称
	public void setName(String name) {
		super.setName("customRealm");
	}
	
	//认证
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		
		//token是用户输入的
		//第一步:从token里面取出用户的身份信息
		String userCode = (String)token.getPrincipal();
		
		//第二步:拿着用户输入的userCode从数据库中查询是否存在该用户
		//...数据库
		/*模拟从数据库查询到密码,
		 * 这里是已经根据用户输入的账号在数据库查了,
		 * 已经是查得有该账户的存在,并将密码也查询出来了,
		 * 111就是该账户的密码
		*/
		String password = "111";
		
		
		//如果查询不到返回null
		
		//如果查询到返回认证信息AuthenticationInfo,AuthenticationInfo是一个接口
		SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(userCode, password, this.getName());
		
		
		return simpleAuthenticationInfo;
	}
	
	

	//授权
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		return null;
	}

}


创建一个配置文件shiro.ini,将创建好的Realm设置securityManager


[main]
customRealm=com.mo.shiro.realm.CustomRealm
securityManager.realms=$customRealm



测试单元

	@Test
	public void test1(){
		
		//创建securityManager工厂,通过配置文件创建securityManager工厂
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");		 
		
		//通过factory创建SecurityManager实例
		SecurityManager securityManager = factory.getInstance();
		
		//通过将securityManager设置到当前的环境中
		SecurityUtils.setSecurityManager(securityManager);
		
		//从SecurityUtils中得到一个subject,subject就是实体
		Subject subject = SecurityUtils.getSubject();
		
		//在实体登录之前创建一个令牌token,
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","111");
		
		
		
		try {
			//实体的登录
			subject.login(token);
		} catch (AuthenticationException e) {
			//登录失败就会抛出异常
			e.printStackTrace();
		}
		
		//查看认证是否通过,返回的是一个boolean数据类型
		boolean authenticated = subject.isAuthenticated();
		System.out.println(authenticated);
		
		
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值