Realms充当Shiro与应用程序安全数据之间的桥梁,简而言之,Shiro从Realms中获取安全数据(用户,角色,权限)。Shiro 也为我么提供了一些常用的Realm(IniRealm,JdbcRealm)等,这里我们会介绍IniRealm的使用,这也是Shiro默认使用的Realm,它是从ini文件中获取用户,角色,权限。本章先介绍如何使用IniRealm验证用户的。至于Realm的原理后续会详细介绍。
ini文件它可以配置用户,角色,权限以及Realm等SecurityManager管理的组件。如下所示为Ini配置文件介绍。
[main]
# 用于配置对象实例以及其属性
# 比如:securityManager, Realms和一些其他由SecurityManager管理的实例
[users]
# 用于简单的配置用户以及其凭证,一般情况下我们都是从数据库获取用户以及凭证
[roles]
# 用于简单的配置用户的角色,一般情况下我们都是从数据库获取用户的角色,这部分会在权限控制中讲解
[urls]
# 在Web应用中基于URL的安全控制管理配置,这部分在Shiro在web中的使用部分介绍
该部分我们只是用到[users]部分配置,[users]部分允许您定义一组静态用户帐户。这在用户帐户数量很少或不需要在运行时动态创建用户帐户的环境中非常有用。[users]配置的格式为:username = password,roleName1,roleName2...roleNameN.
- 等号左侧的值为用户账户
- 右侧第一个值为用户密码
- 右侧其他的值为用户的角色,一个用户可以配置多个角色
[users]
#账号 = 密码
admin = secret
#账号 = 密码 , 角色 , 角色 其中角色为[roles]中配置的角色,此部分不涉及权限
lonestarr = vespa, goodguy, schwartz
如下为代码案例:
public class IniRealmAuthentication {
public static void main(String[] args) {
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-Ini.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
try {
UsernamePasswordToken upt = new UsernamePasswordToken("pharos", "123456");
subject.login(upt);
System.out.println("认证成功");
} catch (AuthenticationException e) {
System.out.println("认证失败");
}
}
}
[users]
pharos = 123456
wangke = 456789
admin = abcdefg