Shiro框架

Apache Shiro框架

博客原文:链接

一、什么是Apache Shiro?

​ Apache Shiro是Java的一个安全框架。功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案。

​ 实际上,Shiro的主要功能是管理应用程序中与安全相关的全部,同时尽可能支持多种实现方法。Shiro是建立在完善的接口驱动设计和面向对象原则之上的,支持各种自定义行为。Shiro提供的默认实现,使其能完成与其他安全框架同样的功能,这不也是我们一直努力想要得到的吗!

​ Apache Shiro相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。

二、Shiro可以操作什么
  • 验证用户身份以验证其身份
  • 对用户执行访问控制,例如:
    • 确定是否为用户分配了特定的安全角色
    • 确定是否允许用户做某事
  • 即使在没有Web或EJB容器的情况下,也可以在任何环境中使用Session API。
  • 在身份验证,访问控制或会话的生存期内对事件做出反应。
  • 汇总1个或更多用户安全数据的数据源,并将其全部显示为单个复合用户“视图”。
  • 启用单点登录(SSO)功能
  • 启用“记住我”服务以进行用户关联,而无需登录
  • Shiro尝试在所有应用程序环境中实现这些目标-从最简单的命令行应用程序到最大的企业应用程序,而不必强加对其他第三方框架,容器或应用程序服务器的依赖
三、Apache Shiro功能

​ Apache Shiro是具有许多功能的全面的应用程序安全框架,组织方式如下:

在这里插入图片描述

Shiro以Shiro开发团队所谓的**“应用程序安全性的四个基石”**为目标-身份验证,授权,会话管理和密码术:

  • **身份验证(Authentication):**有时称为“登录”,这是证明用户是他们所说的身份的行为。
  • **授权(Authorization):**访问控制的过程,即确定“谁”有权访问“什么”。
  • **会话管理(SessionManagement):**即使在非Web或EJB应用程序中,也管理用户特定的会话。
  • **密码术(Cryptography):**使用密码算法保持数据安全,同时仍易于使用。

不同的应用程序环境中,还具有其他功能来支持和加强这些问题,尤其是:

  • **Web支持:**Shiro的Web支持API可帮助轻松保护Web应用程序。
  • **缓存:**缓存是Apache Shiro API的第一层公民,可确保安全操作保持快速有效。
  • **并发性:**Apache Shiro的并发功能支持多线程应用程序。
  • **测试:**测试支持可以帮助您编写单元测试和集成测试,并确保您的代码将按预期进行保护。
  • **“运行方式”:**一种功能,允许用户采用其他用户的身份(如果允许),有时在管理方案中很有用。
  • **“记住我”:**在整个会话中记住用户的身份,因此他们仅在必要时登录。
四、Shiro的架构

​ Shiro的架构主要有三个顶级概念Subject, SecurityManagerRealms。图中展示了这些组件间的交互,接下来详细介绍:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4qVuJghB-1614160535152)(D:\hsq\img\ShiroBasicArchitecture.png)]

  • Subject: 正如我们在教程里提到的, Subject实际上是安全领域里的“当前执行用户”。“User”通常意指人类,而Subject 却可以是一个人,或者是第三方服务,守护进程帐户,定时任务等等——可以是基本上任何正与软件交互的事物。

    Subject的实例都会(也是必须)绑定一个SecurityManager,对Subject的操作会转为Subject与SecurityManager之间的交互。

  • SecurityManagerSecurityManager是Shiro架构的核心,像个“保护伞”一样协调内部组件运作。不过一旦SecurityManager配置完成,它就被放一边去了,通常开发人员只需要使用Subject

    稍后详细介绍SecurityManager,现在你需要知道的是,当使用Subject进行各种操作时,在背后做苦力活的可是SecurityManager,这一点在上面的图中有所体现。

  • Realms: Realms在Shiro和你的安全数据之间扮演“桥梁”或“连接器”的角色。当需要用到安全数据比如用户帐号来进行认证或授权时,Shiro会从应用配置的一个或多个Realms中来查找。

    这个意义上Realm其实就是安全(操作)特有的DAO:它封装了数据源的细节,并在Shiro需要时提供相关数据。配置Shiro时,必须至少得有一个Realm以用于认证(和/或)授权。在SecurityManager中可以配置Realm,至少得有一个。

    Shiro自带一些开箱即用的Realms用于连接像是LDAP,关系数据库(JDBC),文本配置源(比如INI)以及属性文件等等这样的安全数据来源。如果默认的不能满足你的需要,你也可以自己实现一个Realm。

    同其他内部组件一样,Realms由SecurityManager管理着如何获取数据并传给Subject的实例。

Shiro的核心架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Ije8baP-1614160535156)(D:\hsq\img\ShiroArchitecture.png)]

**Subject:**主体,既可以代表用户,也可以代表程序(网络爬虫等),它需要访问系统,系统则需要对其进行认证和授权,可以看到主体可以是任何可以与应用交互的“用户”。

SecurityManager: 安全管理,用户请求Url,对应于一个Subject对象,由SecurityManager统一对Subject进行认证和授权(父)。

Authenricator: 认证器,主要对Subject进行认证,Subject的信息在shrio中是通过AuthenticationToken对象来储存,由AuthenricationStrategy进行验证管理.(子)。如果用户觉得Shiro默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了;

**Authorizer:**授权器,Subject认证后,由它来对其授予对应角色权限.(子)即控制着用户能访问应用中的哪些功能;

SessionManager: Shiro的session管理方式,Shiro提供了一个专门管理session的方式,通常的web程序中的session是HttpSession的对象,是由web容器来管理的.如果写过Servlet就应该知道Session的概念,Session呢需要有人去管理它的生命周期,这个组件就是SessionManager;而Shiro并不仅仅可以用在Web环境,也可以用在如普通的JavaSE环境、EJB等环境;所有呢,Shiro就抽象了一个自己的Session来管理主体与应用之间交互的数据;这样的话,比如我们在Web环境用,刚开始是一台Web服务器;接着又上了台EJB服务器;这时想把两台服务器的会话数据放到一个地方,这个时候就可以实现自己的分布式会话(如把数据放到Memcached服务器);

SessionDao: session的接口,Shiro通过它来管理session数据,个性化的session数据储存需要使用sessionDao.

CacheManager: 缓存控制器,主要对session数据和授权数据进行缓存,减小数据库的访问压力.可以通过和ehcache的整合对缓存数据进行管理.

Pluggable Realms: 可扩展领域,相当于数据源,我们通过上面内容可以大致了解到Shiro的工作原理,但Shiro是怎样得知Subject的信息和数据库的信息是否匹配呢?Shiro这里就提供了一个realms的概念,它的作用就是得到数据库中的信息.这个realm是可以多个并且可以自定义,只需继承AuthorizingRealm这个接口就可以了.可以有1个或多个Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是JDBC实现,也可以是LDAP实现,或者内存实现等等,由用户提供,Shiro不知道你的用户/权限存储在哪及以何种格式存储,所以我们一般在应用中都需要实现自己的Realm密码模块

注意:对Subject进行认证和授权都需要调用realm,所以realm不仅仅相当于数据源,更加包含了认证和授权的一种逻辑.

Cryptography: 密码模块,一个密码管理工具,提供了一套加密/解密的组件.比如常用的散列,加/解密等功能,日常练习所使用的md5算法其实是一种散列算法,只能加密,不能解密.

Shiro处理认证流程图

在这里插入图片描述

可见,Shiro处理流程是一级一级的调用,主要是调用Authentication来进行验证,最后还是需要使用realm来进行身份验证。

五、过滤器权限拦截器
过滤器简称对应的java类
anonorg.apache.shiro.web.filter.authc.AnonymousFilter
authcorg.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
portorg.apache.shiro.web.filter.authz.PortFilter
restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter
sslorg.apache.shiro.web.filter.authz.SslFilter
userorg.apache.shiro.web.filter.authc.UserFilter
logoutorg.apache.shiro.web.filter.authc.LogoutFilter
六、JSP shiro标签

在这里插入图片描述

权限基础
ITeye论坛关于权限控制的讨论
RBAC新解

其他相关文章
Shiro官方文档
Shiro官方推荐资料
Shiro参考手册中文版
简单shiro扩展实现NOT、AND、OR权限验证
集成Shiro后当遇到404错误时会丢失session
在velocity 模板文件中,实现 shiro 权限验证

七、Shiro

使用Shiro框架分析的流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yhyT3Cel-1614160535162)(D:\hsq\img\shiro流程分析图.jpg)]

配置用户名和密码的注意

用户名保证唯一性:验证用户名是否唯一和是否占用

密码入库要用暗文

package microservice.fpzj.core.util;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;

public class PasswordUtil {
    private String algorithmName = "md5";   //指定散列算法为MD5,还有别的算法如:SHA256、SHA1、SHA512
    private int hashIterations = 2;     //散列迭代次数 md5(md5(pwd)): new Md5Hash(pwd, salt, 2).toString()
    public void setAlgorithmName(String algorithmName) {
        this.algorithmName = algorithmName;
    }
    public void setHashIterations(int hashIterations) {
        this.hashIterations = hashIterations;
    }
    //加密:输入明文得到密文
    public String encodePassword(String pwd, String salt) {
        //user.setSalt(randomNumberGenerator.nextBytes().toHex());
        String newPassword = new SimpleHash(
                algorithmName,
                pwd,
                ByteSource.Util.bytes(salt),
                hashIterations).toHex();

        return newPassword;
    } 
    public boolean verifyPassword(String targetPassword, String pwd, String salt){
         String newPassword = this.encodePassword(targetPassword, salt);
         if(newPassword.equals(pwd)){
             return true;
         }else{
             return false;
         }
    }

}

案例:ssm+shiro

博客文章:https://www.cnblogs.com/kitor/p/11281629.html

springboot+shiro

博客文章:https://blog.csdn.net/wohaqiyi/article/details/79338439

ssm整合shiro单点登录: https://blog.csdn.net/m0_37797991/article/details/78529096

springBoot整合shiro单点登录:https://blog.csdn.net/liuchuanhong1/article/details/76850181

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值