美文网首页
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