Shiro使用之自定义realm
2020年8月3日
什么是Realm
Realm直译为王国或领地,再Shiro中,realm负责链接认证授权服务与其所使用的数据源。
如果说Shiro是小区保安,负责筛查所有进出小区的车辆,realm就是保安手上的住户名单,负责记录每个用户的信息,包含Principals
(用户识别信息,通常是用户名或邮箱手机号),Credentials
(用户证明信息,通常就是密码),和Authorization
(用户身份)。
如何自定义Realm
Shiro提供了很多Realm实现,其中常用的有IniRealm
,PropertiesRealm
,JdbcRealm
。通常在项目中用户信息是存储于数据库中,对应可使用JdbcRealm
。但JdbcRealm
的使用中需要我们定义身份与用户信息的查询语句,这些内容通常是我们在实现DAO和Service层时就已经做过的。加上有事在获取用户信息的过程中会有一些特殊的业务逻辑,我们通常会通过继承AuthorizingRealm
来实现自定义Realm。
AuthorizingRealm
是一个抽象类,提供了doGetAuthorizationInfo
抽象方法,同时通过继承AuthenticatingRealm
提供doGetAuthenticationInfo
。我们在继承AuthorizingRealm
时需要实现这两个抽象方法。
doGetAuthenticationInfo
方法用于获取系统存储的用户认证信息,它接收一个用户的Token,返回该用户的认证信息AuthenticationInfo
。
doGetAuthorizationInfo
方法用于获取系统所存储的用户身份信息,即用户角色,它接收用户的Principals信息,返回用户的身份信息AuthorizationInfo
。
具体实现
1 | public class MyRealm extends AuthorizingRealm { |