【Shiro】01 概述 & 快速上手

什么是Shiro?

Apache Shiro 是Java的一个权限安全框架

一些功能:认证、授权、加密、会话管理、与Web 集成、缓存等
 
Shiro官网地址:[ 点击访问 ]
http://shiro.apache.org/

 

4个主要功能:

- Authentication 

  登陆,身份认证。完成用户登陆的密码匹配

- Authorization

  授权,权限验证。判断一个请求和一些事件触发是否可以被允许

- Session Management

  会话管理

- Cryptography

  信息加密,对密码的安全加密处理

其他功能:

WebSupport,Web支持,集成JavaEE

Concurrency,高并发支持,多线程情况下的授权和认证

Testing,测试

Caching,缓存模块

RunAs,让已经登陆的用户以其他用户身份操作管理

RememberMe,记住我

 

Hello Shiro?

演示HelloShiro需要的一些核心组件

导入工程lib目录

导入Shiro配置文件和日志配置文件

没有Maven管理,配置文件就直接放在src目录下

 

对Shiro的快速入门源码解析:

1、创建Shiro安全管理器实例

        // The easiest way to create a Shiro SecurityManager with configured
        // 创建Shiro安全管理器最简单的方式是使用配置

        // realms, users, roles and permissions is to use the simple INI config.
        // 访问域,用户,角色(权限),行为,都放在这个简单的ini配置文件中

        // We'll do that by using a factory that can ingest a .ini file and
        // 我们将会使用工厂实例注入ini配置文件,

        // return a SecurityManager instance:
        // 并且返回Shiro安全管理器的实例

        // Use the shiro.ini file at the root of the classpath
        // shiro.ini配置文件放在类路径的根下面

        // (file: and url: prefixes load from files and urls respectively):
        // 分别从文件和url加载前缀
        
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();

2、继续配置安全管理器对象

        // for this simple example quickstart, make the SecurityManager accessible as a JVM singleton.
        // 在这个简单的快速入门案例中,使安全管理器实例在JVM中是一个可访问的单利对象

        //  Most applications wouldn't do this
        // 但是在大多数应用中不会这么来干

        // and instead rely on their container configuration or web.xml for webapps.
        // 并且对于webapps而言,是依赖于它们的容器配置文件或web.xml文件

        // That is outside the scope of this simple quickstart, so
        // 这已经超出了我们shiro快速入门的范畴了,所以

        // we'll just do the bare minimum so you can continue to get a feel for things.
        // 我们将只做一些你能继续体验的最基础的事情
        
        SecurityUtils.setSecurityManager(securityManager);

       // Now that a simple Shiro environment is set up, let's see what you can do:
        // 现在Shiro的环境已经部署出来了,瞧瞧我们能干点啥

3、获取当前执行的用户

// get the currently executing user:
        // 获取当前正在执行的用户
        Subject currentUser = SecurityUtils.getSubject();

获取当前的Subject对象

4、通过Session存储的认证信息来处理授权安全

获取 & 简单的判断

        // Do some stuff with a Session (no need for a web or EJB container!!!)
        // 用会话做些事情(不需要web或EJB容器!!!)【测试Session】

        // 获取Session
        Session session = currentUser.getSession();

        // 在Session对象中注入某一属性
        session.setAttribute("someKey", "aValue");

        // 然后又获取这个属性值
        String value = (String) session.getAttribute("someKey");

        if (value.equals("aValue")) {
       //是否匹配
            log.info("---> Retrieved the correct value! [" + value + "]");
        }

5、权限详细的操作

        // let's login the current user so we can check against roles and permissions:
        // 让我们登录当前用户,以便检查角色和权限:

        // 测试当前的用户是否已经认证,即是否登陆 调用isAuthenticated()方法判断
        if (!currentUser.isAuthenticated()) {
            // 如果不是则把认证信息封装在一个令牌对象中
            UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
            // 对这个令牌对象设置 记住我
            token.setRememberMe(true);
            try {
                // 执行登陆指令,能否成功取决于在shiro.ini中是否配置令牌中认证信息
                currentUser.login(token);
            } 
            // 未知账户异常 ,没有此用户抛出
            catch (UnknownAccountException uae) {
                log.info("----> There is no user with username of " + token.getPrincipal());
                return; 
            } 
            // 不正确的资格证书,账户的密码错误
            catch (IncorrectCredentialsException ice) {
                log.info("----> Password for account " + token.getPrincipal() + " was incorrect!");
                return; 
            } 
            //锁定的账户,该用户的账号已经上锁,请联系你的管理员解锁
            catch (LockedAccountException lae) {
                log.info("The account for username " + token.getPrincipal() + " is locked.  " +
                        "Please contact your administrator to unlock it.");
            }
            // ... catch more exceptions here (maybe custom ones specific to your application?
            // 更多的授权异常问题,翻阅shiro文档详细
            catch (AuthenticationException ae) {
                //unexpected condition?  error?
            }
        }

        //say who they are:
        // 说明 这是谁的用户

        //  print their identifying principal (in this case, a username):
        //  打印它们的标识主体,在这个演示案例中,只有一个用户名称
        log.info("----> User [" + currentUser.getPrincipal() + "] logged in successfully.");

        //test a role:
        // 测试权限

        // hasRole,判断是否存在这样一个角色权限?
        if (currentUser.hasRole("schwartz")) {
            // 存在,愿施瓦兹与你同在
            log.info("----> May the Schwartz be with you!");
        } else {
            // 你好,凡人
            log.info("----> Hello, mere mortal.");
            return; 
        }

        //test a typed permission (not instance-level)
        // 测试一用户是否具备这个行为 isPermitted()
        if (currentUser.isPermitted("lightsaber:weild")) {
            // 你有这个行为,请明智的使用
            log.info("----> You may use a lightsaber ring.  Use it wisely.");
        } else {
            // 对卟住,这只是大师才能用的行为
            log.info("Sorry, lightsaber rings are for schwartz masters only.");
        }

        //a (very powerful) Instance Level permission:
        // 一个非常强大的实例等级行为

        // 判断这个用户是否被允许了
        if (currentUser.isPermitted("user:delete:zhangsan")) {

            log.info("----> You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  " +
                    "Here are the keys - have fun!");
        } else {

            log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
        }

6、完成安全授权,退出

        // 判断是否完成了授权验证

        System.out.println("---->" + currentUser.isAuthenticated());

        //all done - log out!
        // 全部搞定,退出
        currentUser.logout();

        System.out.println("---->" + currentUser.isAuthenticated());

        System.exit(0);
posted @ 2020-06-03 09:06  emdzz  阅读(191)  评论(0编辑  收藏  举报