Realm的使用:
如果我们希望可以将Shiro校验的用户信息存储在数据库里面,再从数据库里面读取出来。可以通过Shiro的Realm机制实现。
Realm机制就是将配置文件的校验用户信息存放在数据库、LDAP等数据存储系统里面。
Realm事例
第一步:创建项目,导入包
第二步:创建shiro.ini配置文件
[main] #创建一个myRealm对象 myRealm=cn.hzh.realm.MyRealm #将myRealm对象放在SecurityManager容器中 securityManager.realms=$myRealm |
第三步:创建入口的测试类对象
public class ShiroTest { public static void main(String[] args) { // shrio框架读取ini配置文件 IniSecurityManagerFactory ismf = new IniSecurityManagerFactory("classpath:shiro-config.ini"); // 获得SecurityManager对象 SecurityManager securityManager = ismf.createInstance(); // 设置一个身份对象Subject SecurityUtils.setSecurityManager(securityManager); // 获得一个身份对象Subject Subject subject = SecurityUtils.getSubject(); // 设置用户名和密码 UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456"); // 校验参数 try { Subject resultSubject = securityManager.login(subject, token); System.out.println("验证通过获取用户名:" + resultSubject.getPrincipal()); } catch (AuthenticationException e) { e.printStackTrace(); } } } |
第四步:创建Realm对象
public class MyRealm extends AuthorizingRealm { @Override /** * 权限验证,验证用户名密码是否正确 * 如果校验成功,我们就返回AuthenticationInfo对象 如果校验失败,返回一个异常 * */ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // principal:返回验证后的信息,接收方通过subject对象接收 // credentials:设置密码 // realmName:返回realm对象名 if ("admin".equals(token.getPrincipal())) { try { SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(), "123456", this.getName()); PrincipalCollection principals = info.getPrincipals(); System.out.println("用户名:" + principals); return info; } catch (Exception e) { e.printStackTrace(); } } return null; }
/** * 授权 根据通过校验的身份(subject),就给予什么权限登录成功的访问者 * 将查询到的权限信息封装在AuthorizationInfo里面返回 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { return null; } } |