Shiro入门6:自定义realm查询数据库进行认证

在学习自定义Realm的时候很多人都会有这个问题:

为什么要用Realm?自定义Realm有什么作用?

将来实际开发需要realm从数据库查询信息


Realm是什么?

关于Realm的作用及解释,

可以参考:http://blog.csdn.net/nthack5730/article/details/50964707 【这里介绍什么是Realm】

也可以参考:http://blog.csdn.net/nthack5730/article/details/50965025【关于Realm在调用过程中的流程】


此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/50971087

更多有关老猫的文章:http://blog.csdn.net/nthack5730



如何实现Realm?

实现AuthorizingRealm【一般自定义Realm实现这个类】

CustomRealm.java

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
 * @author CatScan
 *
 */
public class CustomRealm extends AuthorizingRealm{
	final String realmName="customRealm";
	
	
	//设置realmName
	@Override
	public void setName(String name) {
		super.setName(realmName);
	}
	
	
	
	//用于认证
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		
		// 第一步从token中取出用户发送过来的身份信息
 		String str = (String) token.getPrincipal();
		
		//第二步根据用户输入的帐号从数据库查询
		//...
		String pwd = "11111";
		
		
		//如果查询不到返回null
		//如果查询到,返回认证信息:AuthenticationInfo
		
		SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(str, pwd, this.getName());
		
		return simpleAuthenticationInfo;
	}

	
	
	//用于授权
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(
			PrincipalCollection principals) {
		return null;
	}
}




需要什么配置ini文件?

需要在shiro-realm.ini中配置realm注入到SecurityManager中

shiro-realm.ini

[main]

#自定义realm
customRealm = cn.marer.shiro.realm.CustomRealm

#将realm设置到securityManager,相当于Spring中的注入
securityManager.realms = $customRealm

此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/50971087

更多有关老猫的文章:http://blog.csdn.net/nthack5730



测试方法

下面这个只是测试方法,在这里我就不发详细的测试类了,测试类里面有上一章节我发过的Shiro的HelloWorld,还是使用Junit测试。

//自定义realm
	@Test
	public void testCustomRealm(){
		//创建securityManager工厂,通过Ini配置文件创建securityManager工厂
		Factory factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");
		
		//创建SecurityManager
		SecurityManager sm = factory.getInstance();
		
		//将securityManager设置到当前的环境中
		SecurityUtils.setSecurityManager(sm);
		
		//从SecurityUtils里面创建一个subject
		Subject subject = SecurityUtils.getSubject();
		
		//在认证提交前,需要准备token(令牌)
		//这里的将来的用户和密码是由用户输入进去的
		UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "11111");
		
		try {
			//执行认证提交
			subject.login(token);
		} catch (AuthenticationException e) {
			e.printStackTrace();
		}
		
		//是否认证通过
		boolean isAuthenticated = subject.isAuthenticated();
		
		System.out.println("是否认证通过:" + isAuthenticated);
		
		
		//退出操作
		subject.logout();
		
		//是否认证通过
		isAuthenticated = subject.isAuthenticated();
		
		System.out.println("是否认证通过:" + isAuthenticated);
		
		
	}


好了,自定义Realm就写到这,下节会给大家发一下自定义Realm对散列(MD5)的支持












你可能感兴趣的:(3️⃣设计与思维,-,✅,-----权限管理,-----Shiro,Shiro与SSH深入浅出)