zoukankan      html  css  js  c++  java
  • 【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);
  • 相关阅读:
    潜入ICU的四逆汤
    经方医的视角
    黄连解毒汤治疗月经过多
    柳暗花明又一方
    PHP 相关性系数计算
    备忘-VSCODE、apache配置
    c# 基于文件系统实现的队列处理类
    notepad++ 快速运行PHP代码
    dat.gui stats.js 通用参数配置及图像统计工具
    AutoHotkey 自动化脚本工具实例
  • 原文地址:https://www.cnblogs.com/mindzone/p/13034715.html
Copyright © 2011-2022 走看看