zoukankan      html  css  js  c++  java
  • shiro

     



    1. shiro概述

      Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
      shiro包含三个核心组件:Subject, SecurityManager 和 Realms。


    2. shiro组件介绍

      2.1 Subject

      即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
      Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。

      2.2 SecurityManager

      它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。

      2.3 Realm

      Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
      从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
      Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
     


     3. 使用实例

      3.1 认证Authentication

        public void addUser() {
            simpleAccountRealm = new SimpleAccountRealm();
            // 添加主体权限
            simpleAccountRealm.addAccount("Mr.24", "24");
        }
    
    public void testAuthentication() {
    
        //1. 构建SecurityManager
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(simpleAccountRealm);
    
        // 2. 主体提交认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();
    
        UsernamePasswordToken token = new UsernamePasswordToken("Mr.24", "24");
        subject.login(token);
    
        System.out.println("isAuthenticated : " + subject.isAuthenticated());
    
        // 如果不是已经添加的账号密码,会抛出UnknownAccountException
    
        subject.logout();
    
        System.out.println("isAuthenticated : " + subject.isAuthenticated());
    }
    

      

      

      3.2 授权Authorization

        public void addUser() {
            simpleAccountRealm = new SimpleAccountRealm();
            // 添加主体权限
            simpleAccountRealm.addAccount("Mr.24", "24", "admin", "user");
        }
    

      

    public void testAuthorization() {
    
            //1. 构建SecurityManager
            DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
            defaultSecurityManager.setRealm(simpleAccountRealm);
    
            // 2. 主体提交认证请求
            SecurityUtils.setSecurityManager(defaultSecurityManager);
            Subject subject = SecurityUtils.getSubject();
    
            UsernamePasswordToken token = new UsernamePasswordToken("Mr.24", "24");
            subject.login(token);
    
            System.out.println("isAuthenticated : " + subject.isAuthenticated());
    
            // 校验主体权限
            subject.checkRoles("admin", "user");
        }
    


    4. 自定义Realm

      4.1 内置Realm

        4.1.1 IniRealm

        首先新建user.ini文件,作为IniRealm的资源文件。

    [users]
    Mr.24=24,admin
    [roles]
    admin=user:delete,user:update
    

       针对IniRealm进行测试

     1   @Test
     2     public void testAuthentication() {
     3 
     4         IniRealm iniRealm = new IniRealm("classpath:user.ini");
     5 
     6         //1. 构建SecurityManager
     7         DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
     8         defaultSecurityManager.setRealm(iniRealm);
     9 
    10         // 2. 主体提交认证请求
    11         SecurityUtils.setSecurityManager(defaultSecurityManager);
    12         Subject subject = SecurityUtils.getSubject();
    13 
    14         UsernamePasswordToken token = new UsernamePasswordToken("Mr.24", "24");
    15 
    16         // org.apache.shiro.authc.UnknownAccountException:
    17         // Realm [org.apache.shiro.realm.text.IniRealm@523884b2] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - Mr.214, rememberMe=false].
    18         // UsernamePasswordToken tokenWithWrongName = new UsernamePasswordToken("Mr.23", "24");
    19 
    20         // org.apache.shiro.authc.IncorrectCredentialsException:
    21         // Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - Mr.24, rememberMe=false] did not match the expected credentials.
    22         //UsernamePasswordToken tokenWithWrongPasswd = new UsernamePasswordToken("Mr.24", "23");
    23 
    24         subject.login(token);
    25 
    26         System.out.println("isAuthenticated : " + subject.isAuthenticated());
    27 
    28         // 角色校验
    29         subject.checkRole("admin");
    30 
    31         // 权限校验
    32         subject.checkPermission("user:delete");
    33         subject.checkPermission("user:update");
    34     }

        4.1.2 JdbcRealm

  • 相关阅读:
    打造基于CentOS7的xfce最简工作环境
    Linux下C程序的编辑,编译和运行以及调试
    修正 XE6 TListView 上方 SearchBok 右边的清除钮显示
    TabControl 显示彩色的图示 (XE6 Firemonkey)
    TSwitch 中文简繁显示支持(XE6 Android)
    改变 TMemo 的背景颜色 (Firemonkey)
    修正 XE5 Android 键盘三个问题
    Delphi 收藏
    展示 Popup 的使用方法
    ListView 下拉更新 (支持 Android)
  • 原文地址:https://www.cnblogs.com/Mr24/p/10127939.html
Copyright © 2011-2022 走看看