shrio框架的realm机制

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;

       }

}

原文地址:https://www.cnblogs.com/ong-zhanhon/p/10846667.html