Realm简介:
数据域,Shiro和安全数据的连接器,好比jdbc连接数据库; 通过realm获取认证授权相关信息
realm作用:
Shiro 从 Realm 获取安全数据
默认自带的realm:
idae查看realm继承关系,有默认实现和自定义继承的realm
两个概念:
principal : 主体的标示,可以有多个,但是需要具有唯一性,常见的有用户名,手机号,邮箱等
credential:凭证, 一般就是密码
所以一般我们说 principal + credential 就账号 + 密码
开发中,往往是自定义realm , 即集成 AuthorizingRealm
IniRealm:
主要是将数据通过一定的格式存放在系统文件中:xxxxxx.ini
在项目的resources目录下新建shiro.ini文件,内容为:
# 格式 name=password,role1,role2,..roleN
[users]
#用户名 = 密码,所拥有的角色
woxbwo = 456, user
zbbiex = 123,admin,user
# 格式 role=permission1,permission2...permissionN 也可以用通配符
# 下面配置user的权限为所有video:find,video:buy,如果需要配置video全部操作crud 则 user = video:*
[roles]
user = video:find,video:buy
# 'admin' role has all permissions, indicated by the wildcard '*'
admin = *
实战代码:
public class ShiroIniRealmTest {
@Test
public void shiroIniRealmTest() {
//创建SecurityManager工厂,通过配置文件ini创建
Factory<SecurityManager> iniSecurityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager instance = iniSecurityManagerFactory.getInstance();
//将securityManager 设置到当前运行环境中
SecurityUtils.setSecurityManager(instance);
Subject subject = SecurityUtils.getSubject();
//用户输入的账号密码
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("woxbwo", "456");
subject.login(usernamePasswordToken);
System.out.println(" 认证结果:"+subject.isAuthenticated());
System.out.println(" 是否有对应的user角色:"+subject.hasRole("user"));
System.out.println(" getPrincipal=" + subject.getPrincipal());
subject.checkRole("user");
subject.checkPermission("video:find");
System.out.println( "是否有video:find 权限:"+ subject.isPermitted("video:find"));
subject.logout();
System.out.println("logout后认证结果:"+subject.isAuthenticated());
}
}
验证结果
认证结果:true
是否有对应的user角色:true
getPrincipal=woxbwo
是否有video:find 权限:true
01:18:42.477 [main] DEBUG org.apache.shiro.mgt.DefaultSecurityManager - Logging out subject with primary principal woxbwo
01:18:42.477 [main] DEBUG org.apache.shiro.session.mgt.AbstractSessionManager - Stopping session with id [ab545c66-a6f9-43ed-b5f6-71e37e89c1cb]
logout后认证结果:false