zoukankan      html  css  js  c++  java
  • Apache Shiro

    简介

    Apache Shiro是一个灵活强大的开源安全框架。它能处理认证、授权、企业session管理以及加密。

    Apache Shiro的初衷是简单上手易于理解。
    Shiro旨在在各种应用环境(小到命令行应用,大到企业级应用)实现以上功能,无需第三方依赖,容器或应用服务。当然需要的话可以集成到这些环境。

    Apache Shiro的功能:
    核心功能:

    • Authentication(认证):解决登录问题
    • Authorization(授权):解决权限控制问题,就是某人有权限访问哪些内容
    • Session Management (会话管理): 管理用户的会话
    • Cryptography(加密):使用加密算法确保数据安全

    附加功能:

    • web support API能很简单的保护web 应用
    • caching能够使安全操作更高效
    • 并发
    • 测试框架,能实现安全方面的单元测试以及集成测试。
    • “Run as”:这里我理解为用户角色切换
    • “Remember Me”:这里我理解为在浏览器登录过一次,下次就无需再登录了

    术语

    • Authentication: 校验用户身份,确保应用被真实的身份访问
    • Authorization: 也叫权限控制,决定用户哪些内容可以访问,哪些内容不能访问,通常使用角色role以及权限permissions来实现。
    • Cipher: 加密解密算法。
    • Credential: 中文翻译为证书。它是用来校验用户身份的信息。credential通常是指用用户自己知道的私密信息,例如密码
    • Cryptography: 密码系统。保护信息的措施,将信息脱敏。主要有两种方式:Cipher加密解密算法,以及不可逆转的散列算法。
    • Hash: 散列算法。通常用来对密码,指纹密码通过一些算法(MD5、SHA)转换,并且转换后的密码不可逆
    • Permissions: 许可。仅仅描述行为
    • Principal: 应用中用户信息的所有属性。
    • Realm: 特指安全的DAO。Realm将应用特定的数据转换成Shiro能识别的数据。Shiro提供一些连接安全数据源的Realms,例如LDAP,关系型数据库(JDBC),INI配置文件等等。你也可以注入你自己的Realm。
    • Role: 角色
    • Session: 用来在一段时间内和系统进行交互和用户关联的状态数据。
    • Subject: 主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject

    栗子

    开启shiro

    首先需要知道的是,Shiro中所有的东西都是和SecurityManage关联的。熟悉java security的人都知道,他是Shiro的SecurityManager概念,而不是java的 java.lang.SecurityManager 。

    所以开启shiro的第一步是配置好SecurityManager实例。

    配置:

    # =============================================================================
    # Tutorial INI configuration
      #
      # Usernames/passwords are based on the classic Mel Brooks' film "Spaceballs" :)
      # =============================================================================
    
      # -----------------------------------------------------------------------------
      # Users and their (optional) assigned roles
      # username = password, role1, role2, ..., roleN
      # -----------------------------------------------------------------------------
      [users]
      root = secret, admin
      guest = guest, guest
      presidentskroob = 12345, president
      darkhelmet = ludicrousspeed, darklord, schwartz
      lonestarr = vespa, goodguy, schwartz
    
      # -----------------------------------------------------------------------------
      # Roles with assigned permissions
      # roleName = perm1, perm2, ..., permN
      # -----------------------------------------------------------------------------
      [roles]
      admin = *
      schwartz = lightsaber:*
      goodguy = winnebago:drive:eagle5
      
    

    创建一个SecurityManager实例

    public static void main(String[] args) {
        log.info("My first apache shiro application");
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        System.exit(0);
    }
    

    仅三行代码,Shiro就在应用中添加了。接下来对这三行代码进行解释:

    1. 使用Shiro的IniSecurityManagerFactory获取shiro.ini配置文件,该文件在classpath(resource)的根路径下。
    2. factory.getInstance()方法会解析INI文件并且返回对应的SecurityManager实例。
    3. 在这个简单的例子中,我们将SecurityManager设置为内存中的静态单例。在复杂的场景,可能需要将SecurityManager放在应用特定的内存中,如web应用的ServletContext或者Spring 容器的实例

    使用Shiro

    谈到应用的安全问题,我们很自然的会想到当前用户。Shiro API使用Subject来表示当前用户的概念。

    在安全的世界里,’Subject’主体可以表示一个人,也可以表示第三方进程,定时任务等当前与软件交互的任何事物。

    session

    session类似HttpSessions,唯一不同的是它不需要http环境。

    上面提到的Subject表示当前用户,当前用户是谁,现在还是匿名用户,直到它们至少登录一次。

    if(!subject.isAuthenticated()) {
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lonestarr", "vespa");
        usernamePasswordToken.setRememberMe(true);
        subject.login(usernamePasswordToken);
    }
    

    如果登录失败了怎么办?你可以catch登录失败异常。

    try {
        subject.login(usernamePasswordToken);
    } catch (UnknownAccountException uae) {
        throw new UnknownAccountException("不存在该用户");
    } catch (IncorrectCredentialsException ice) {
        throw new IncorrectCredentialsException("用户名或密码错误");
    }
    
  • 相关阅读:
    <Android 基础(二十六)> 渐变色圆角Button
    Java 中父类怎么调用子类的方法?
    <Android 基础(二十五)> Frame Animation
    Java基础知识点
    HTTP请求流程(二)----Telnet模拟HTTP请求
    telnet远程登录协议
    HTTP协议详解
    STM32 SPI接口的NSS引脚
    TCP/IP
    以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
  • 原文地址:https://www.cnblogs.com/holiday2000/p/9719186.html
Copyright © 2011-2022 走看看