zoukankan      html  css  js  c++  java
  • Apache Shiro 使用手册(一)Shiro架构介绍

    一、什么是Shiro 
    Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能: 

    • 认证 - 用户身份识别,常被称为用户“登录”;
    • 授权 - 访问控制;
    • 密码加密 - 保护或隐藏数据防止被偷窥;
    • 会话管理 - 每用户相关的时间敏感的状态。

    对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro要简单的多。 

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

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

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


    Shiro完整架构图: 

     
    除前文所讲Subject、SecurityManager 、Realm三个核心组件外,Shiro主要组件还包括: 
    Authenticator :认证就是核实用户身份的过程。这个过程的常见例子是大家都熟悉的“用户/密码”组合。多数用户在登录软件系统时,通常提供自己的用户名(当事人)和支持他们的密码(证书)。如果存储在系统中的密码(或密码表示)与用户提供的匹配,他们就被认为通过认证。 
    Authorizer :授权实质上就是访问控制 - 控制用户能够访问应用中的哪些内容,比如资源、Web页面等等。 
    SessionManager :在安全框架领域,Apache Shiro提供了一些独特的东西:可在任何应用或架构层一致地使用Session API。即,Shiro为任何应用提供了一个会话编程范式 - 从小型后台独立应用到大型集群Web应用。这意味着,那些希望使用会话的应用开发者,不必被迫使用Servlet或EJB容器了。或者,如果正在使用这些容器,开发者现在也可以选择使用在任何层统一一致的会话API,取代Servlet或EJB机制。 
    CacheManager :对Shiro的其他组件提供缓存支持。 

    �Shiro认证
    认证就是验证用户身份的过程。在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法。最常见的“实体/凭证”组合便是“用户名/密码”组合。
    一、Shiro认证过程
    1、收集实体/凭据信息
    Java代码
    1.//Exampleusingmostcommonscenarioofusername/passwordpair:
    2.UsernamePasswordTokentoken=newUsernamePasswordToken(username,passwor
    d);
    3.//”RememberMe”built-in:4.token.setRememberMe(true);
    UsernamePasswordToken支持最常见的用户名/密码的认证机制。同时,由于它实现了RememberMeAuthenticationToken接口,我们可以通过令牌设置“记住我”的功能。但是,“已记住”和“已认证”是有区别的:
    已记住的用户仅仅是非匿名用户,你可以通过subject.getPrincipals()获取用户信息。但是它并非是完全认证通过的用户,当你访问需要认证用户的功能时,你仍然需要重新提交认证信息。
    这一区别可以参考亚马逊网站,网站会默认记住登录的用户,再次访问网站时,对于非敏感的页面功能,页面上会显示记住的用户信息,但是当你访问网站账户信息时仍然需要再次进行登录认证。
    2、提交实体/凭据信息
    Java代码
    1.SubjectcurrentUser=SecurityUtils.getSubject();2.currentUser.login(token);
    收集了实体/凭据信息之后,我们可以通过SecurityUtils工具类,获取当前的用户,然后通过调用login方法提交认证。

    3、认证处理
    Java代码
    1.try{2.
    currentUser.login(token);
    3.}catch(UnknownAccountExceptionuae){...4.}catch(IncorrectCredentialsExceptionice){...5.}catch(LockedAccountExceptionlae){...6.}catch(ExcessiveAttemptsExceptioneae){...7.}...catchyourown...
    8.}catch(AuthenticationExceptionae){9.//unexpectederror?
    10.}
    如果login方法执行完毕且没有抛出任何异常信息,那么便认为用户认证通过。之后在应用程序任意地方调用SecurityUtils.getSubject()都可以获取到当前认证通过的用户实例,使用subject.isAuthenticated()判断用户是否已验证都将返回true.
    相反,如果login方法执行过程中抛出异常,那么将认为认证失败。Shiro有着丰富的层次鲜明的异常类来描述认证失败的原因,如代码示例。

    参考文章:

    http://wenku.baidu.com/link?url=xYeiOd_u44piDnAWTR205oKJ_mBhsrUtW2AppqGbmAQxo6Cqn9tI_MLdzrIgh7d3OPfdTSK6eFW_CcpmKpTdwnt65D9OmmuOU-ZAAppZQde

  • 相关阅读:
    龙井和碧螺春的功效与作用
    064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
    063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法
    062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用
    061 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 08 一维数组总结
    060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序
    059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环
    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值
    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
    056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用
  • 原文地址:https://www.cnblogs.com/xuehen/p/4323109.html
Copyright © 2011-2022 走看看