Realm 是可以访问程序特定的安全数据如用户、角色、权限等的一个组件. Realm 会将这些程序特定的安全数据转换成一种 Shiro 可以理解的形式, Shiro 就可以依次提供容易理解的 Subject 程序API, 而不管有多少数据源或者程序中你的数据如何组织.
Realm 通常和数据源是一对一的对应关系, 如关系数据库, LDAP 目录, 文件系统, 或其他类似资源. 因此, Realm 接口的实现使用数据源特定的API 来展示授权数据( 角色, 权限等), 如JDBC, 文件IO, Hibernate 或JPA, 或其他数据访问API
Realm 实质上就是一个特定安全的 DAO
因为这些数据源通常存储身份验证数据( 如密码的凭证) 以及授权数据( 如角色或权限) , 每个 Shiro Realm 都能够执行身份验证和授权操作.
Realm 配置
如果使用 Shiro 的 ini 配置文件, 你可以在[main]区域内像配置其它对象一样定义和引用Realms
在定义一个或多个Realm后,再将它们在securityManager上进行统一配置
例如:
fooRealm = com.company.foo.Realm
barRealm = com.company.another.Realm
bazRealm = com.company.baz.Realm
securityManager.realms = $fooRealm, $barRealm, $bazRealm
简单证明匹配
所有 Shiro 都是开箱即用的, Realm 默认使用一个 SimpleCredentialsMatcher
, SimpleCredentialsMatcher
对存储的用户凭证和从 AuthenticationToken
提交的用户凭证直接执行相等检查
例如,如果提交了一个UsernamePasswordToken
, SimpleCredentialsMatcher
检查提交的密码与存储的密码是否完全相等
SimpleCredentialsMatcher 不仅仅对字符串对比, 它可以对大多数常用类型,如字符串、字符数组、字节数组、文件和输入流等执行对比 .
___________ .___ _____ _________ .__ __
\_ _____/ ____ __| _/ _____/ ____\ \_ ___ \| |__ _____ _______/ |_ ___________
| __)_ / \ / __ | / _ \ __\ / \ \/| | \\__ \ \____ \ __\/ __ \_ __ \
| \ | \/ /_/ | ( <_> ) | \ \___| Y \/ __ \| |_> > | \ ___/| | \/
/_______ /___| /\____ | \____/|__| \______ /___| (____ / __/|__| \___ >__|
\/ \/ \/ \/ \/ \/|__| \/
End of Chapter