美文网首页
shiro 基础篇1

shiro 基础篇1

作者: 夕阳_36c5 | 来源:发表于2020-03-14 22:58 被阅读0次

- Subject(用户主体)

-  SecurityManager(核心安全管理器,认证授权都要经过该对象,相当于springmvc dispatcher)

- realm(数据库)

认证过程

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200314191946214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjA2Njk5NQ==,size_16,color_FFFFFF,t_70)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200314192125118.png)

shiro常见异常:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200314191122844.png)

realm接口体系

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200314192525539.png)

自定义realm

- 一般都会继承**AuthorizingRealm**抽象类,因为该类具备了缓存,认证,授权的方法。

1. 自定义realm类继承AuthorzingRealm

```java

/**

1.  自定义realm

*/

public class MyRealm  extends AuthorizingRealm {

    //myrealm设置名字

    @Override

    public void setName(String name) {

        super.setName("myrealm");

    }

    @Override

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        return null;

    }

    @Override

    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        //参数 token ; 表示登录时包装的UsernamePasswordToken信息

        //获取用户名

        String username = token.getPrincipal().toString();

        System.out.println(token);

        if(!"zhangsan".equals(username)){

              return null;

        }

        String password= "123456";

        //info对象表示realm登录比对信息; 参数1,用户信息,餐数2,密码,参数3,当前reaml名字

        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());

        return info;

    }

}

```

2. 自定义realm文件

```java

#自定义realm

myrealm=com.yxt.realm.MyRealm

#指定securityManager的realms实现

securityManager.realms=$myrealm

```

3. 加载配置文件,执行登录操作

```java

  public static void main(String[] args) {

        //1.创建用户数据

        String username = "zhangsan";

        String password = "123456";

        // 2.创建factory工厂,从ini文件拿数据

        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:my-shiro.ini");

        //3.使用factory创建SecurityManager (有shiro信息)

        DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();

        //4.将UserRealm注入到完全管理器

      /* securityManager.setRealm(new UserRealm2());*/

        //5.把当前安全管理器注入到线程中

        SecurityUtils.setSecurityManager(securityManager);

        //6.获得主体用户

        Subject subject = SecurityUtils.getSubject();

        //7.将用户名和密码封装到token

        UsernamePasswordToken token = new UsernamePasswordToken(username,password);

        //8.进行登录

        try {

            subject.login(token);//进行认证,如果失败会抛异常

            System.out.println("登陆成功");

        }catch (IncorrectCredentialsException e){

            System.out.println("密码不正确");

        }catch (UnknownAccountException e){

            System.out.println("用户名不存在");

        }catch (AuthenticationException e){

            System.out.println("用户名或密码正确");

        }

        // 登出

        subject.logout();

    }

```

相关文章

网友评论

      本文标题:shiro 基础篇1

      本文链接:https://www.haomeiwen.com/subject/hdzoshtx.html