zoukankan      html  css  js  c++  java
  • 细说shiro之三:在独立应用中使用shiro

    官网:https://shiro.apache.org/

    1. 下载
    在非Web环境的独立应用中使用Shiro时,只需要shiro-core组件。
    在Maven项目中的依赖配置如下:

    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.3.2</version>
    </dependency>
    
    <!-- Shiro uses SLF4J for logging. We'll use the 'simple' binding in this example app. See http://www.slf4j.org for more info. --> <dependency>   <groupId>org.slf4j</groupId>   <artifactId>slf4j-simple</artifactId>   <version>1.6.1</version> </dependency>

    特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。
    在此,使用slf4j的简单日志实现slf4j-simple。


    2. 数据源配置
    在Shiro中,Realm定义了访问数据的方式,用来连接不同的数据源,如:LDAP,关系数据库,配置文件等等。
    Realm类图:

    也就是说,可以根据实际需求及应用的权限管理复杂度灵活选择指定数据源。
    在此,以org.apache.shiro.realm.text.IniRealm为例,具体配置如下:

    shiro.ini:

    # =============================================================================
    # 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

    选择了数据源,现在开始使用Shiro进行认证和访问授权控制。

    3. 认证
    在Shiro中,认证即执行用户登录,读取指定Realm连接的数据源,以验证用户身份的有效性与合法性。

    String name = "lonestarr";
    String pass = "vespa";
    Subject currentUser = SecurityUtils.getSubject();
    if(!currentUser.isAuthenticated()) {
      UsernamePasswordToken token = new UsernamePasswordToken(name, pass);
      token.setRememberMe(true);
      try {
        currentUser.login(token);
      } catch (UnknownAccountException e) {
        logger.error(String.format("user not found: %s", name), e);
      } catch(IncorrectCredentialsException e) {
        logger.error(String.format("user: %s pwd: %s error", name, pass), e);
      } catch (ConcurrentAccessException e) {
        logger.error(String.format("user has been authenticated: %s", name), e);
      } catch (AuthenticationException e) {
        logger.error(String.format("account except: %s", name), e);
      }
    }
    logger.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );

    4. 访问授权
    在Shiro中,访问授权即验证用户是否具备执行指定操作的权限(角色或权限验证)。
    特别地!在执行访问授权验证之前,必须执行用户认证。

    String role = "schwartz";
    if(currentUser.hasRole(role)) {
      logger.info(String.format("用户: %s 属于角色:%s", name, role));
    }else{
      logger.error(String.format("用户: %s 不属于角色:%s", name, role));
    }
    
    String perm = "lightsaber:cc";
    if(currentUser.isPermitted(perm)) {
      logger.info(String.format("用户: %s 拥有权限:%s", name, perm));
    }else {
      logger.error(String.format("用户:%s 没有权限:%s", name, perm));
    }

    5. 完整示例
    详见:https://git.oschina.net/cchanghui/test-shirocli.git

  • 相关阅读:
    python爬虫专栏学习
    Scrapy学习笔记
    《The Python Standard Library》——http模块阅读笔记2
    《The Python Standard Library》——http模块阅读笔记1
    《The Python Tutorial》——Errors and Exceptions 阅读笔记
    web服务器架构演化及所其技术知识体系(分布式的由来)
    django学习笔记——搭建博客网站
    《计算机系统要素》学习笔记
    python查看模块版本及所在文件夹
    网络编程---笔记2
  • 原文地址:https://www.cnblogs.com/nuccch/p/6780550.html
Copyright © 2011-2022 走看看