Realm 

Realm:域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法; 也需要从 Realm 得到用户相应的角色/权限进行验证用户是否能进行操作;可以把 Realm 看 成 DataSource , 即 安全数据源。如我们之前的 ini 配置方式将使用 org.apache.shiro.realm.text.IniRealm。  

org.apache.shiro.realm.Realm 接口如下:

String getName(); //返回一个唯一的 Realm 名字 
boolean supports(AuthenticationToken token); //判断此 Realm 是否支持此 
Token AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)  throws AuthenticationException;  //根据 Token 获取认证信息

单 Realm 配置 

1、自定义 Realm 实现(com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1): 

public class MyRealm1 implements Realm {     
	@Override     
	public String getName() {         
		return "myrealm1";     
	}     
	@Override 
	public boolean supports(AuthenticationToken token) { 
		//仅支持 UsernamePasswordToken 类型的 Token         
		return token instanceof UsernamePasswordToken;      
	}     
	@Override     
	public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {         
		String username = (String)token.getPrincipal();  //得到用户名         
		String password = new String((char[])token.getCredentials()); //得到密码         
		if(!"zhang".equals(username)) {             
			throw new UnknownAccountException(); //如果用户名错误         
			}         
		if(!"123".equals(password)) {             
			throw new IncorrectCredentialsException(); //如果密码错误         
			//如果身份认证验证成功,返回一个 AuthenticationInfo 实现;        
			return new SimpleAuthenticationInfo(username, password, getName());    
		} 
	}
}

2、ini 配置文件指定自定义 Realm 实现(shiro-realm.ini) 

#声明一个 
realm myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1 
#指定 securityManager 的 realms 实现 
securityManager.realms=$myRealm1

通过$name 来引入之前的 realm 定义  

3 、 测试用例请参考 com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest 的 testCustomRealm 测试方法,只需要把之前的 shiro.ini 配置文件改成 shiro-realm.ini 即可。 

多 Realm 配置 

1、ini 配置文件(shiro-multi-realm.ini) 

#声明一个 
realm myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1 
myRealm2=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm2 
#指定 securityManager 的 realms 实现 
securityManager.realms=$myRealm1,$myRealm2

securityManager 会按照 realms 指定的顺序进行身份认证。此处我们使用显示指定顺序的方 式指定了 Realm 的顺序,如果删除“securityManager.realms=$myRealm1,$myRealm2”,那 么 securityManager 会按照 realm 声明的顺序进行使用(即无需设置 realms 属性,其会自动 发 现),当我们显示指定 realm 后 , 其 他 没有指定 realm 将被忽略,如 “securityManager.realms=$myRealm1”,那么 myRealm2 不会被自动设置进去。  

2 、 测试用例请参考 com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest 的 testCustomMultiRealm 测试方法。  

Shiro 默认提供的 Realm

QQ截图20160223112502.png

以后一般继承 AuthorizingRealm(授权)即可 ;其继承了 AuthenticatingRealm(即身份验证), 而且也间接继承了CachingRealm(带有缓存实现)。其中主要默认实现如下:

org.apache.shiro.realm.text.IniRealm:[users]部分指定用户名/密码及其角色;[roles]部分指 定角色即权限信息; 

org.apache.shiro.realm.text.PropertiesRealm: user.username=password,role1,role2 指定用户 名/密码及其角色;role.role1=permission1,permission2 指定角色及权限信息; 

org.apache.shiro.realm.jdbc.JdbcRealm:通过 sql 查询相应的信息,如“select password from users where username = ?”获取用户密码,“select password, password_salt from users where username = ?”获取用户密码及盐;“select role_name from user_roles where username = ?” 获取用户角色;“select permission from roles_permissions where role_name = ?”获取角色对 应的权限信息;也可以调用相应的 api 进行自定义 sql

关注极客云图了解更多内容