您现在的位置是:首页 > 正文

shiro-基本原理和逻辑配置

2024-04-01 01:14:49阅读 2

shiro是权限管理的一种,其他的有spring security
sso(spring spring-security oauth)

官方介绍:什么是shiro,shiro构成及所用
https://www.infoq.com/articles/apache-shiro

shiro实现的功能:身份验证、授权、加密、会话管理
在这里插入图片描述

Shiro的架构有三个主要概念 - Subject,SecurityManager和Realms。

基础架构
在这里插入图片描述

详细架构图:
在这里插入图片描述
基本概念
六大模块:认证、授权、加密、会话管理、网络集成、集成

认证:

  1. 基于主题 - 您在Shiro中执行的几乎所有操作都基于当前正在执行的用户,称为主题。您可以轻松地在代码中的任何位置检索主题。这使您更容易理解并在您的应用程序中使用Shiro。

  2. 单一方法调用 - 身份验证过程是单个方法调用。只需要一个方法调用就可以简化API并简化应用程序代码,从而节省您的时间和精力。

  3. 丰富的异常层次结构 - Shiro提供了丰富的异常层次结构,以提供有关登录失败原因的详细说明。层次结构可以帮助您更轻松地诊断与身份验证相关的代码错误或客户服务问题。此外,丰富性可以帮助您在需要时创建更复杂的身份验证功能。

  4. 内置’Remember Me’ - Shiro API中的标准功能是能够在用户返回应用程序时记住他们。您可以通过最少的开发工作为他们提供更好的用户体验。

  5. 可插拔数据源 - Shiro使用可插拔数据访问对象(DAO)(称为Realms)连接到LDAP和Active Directory等安全数据源。为了帮助您避免自己构建和维护集成,Shiro为LDAP,Active Directory和JDBC等流行数据源提供了开箱即用的领域。如果需要,您还可以创建自己的领域,以支持基本领域中未包含的特定功能。

  6. 使用一个或多个领域登录 - 使用Shiro,您可以轻松地针对一个或多个领域对用户进行身份验证,并返回其身份的统一视图。此外,您可以使用Shiro的身份验证策略概念自定义身份验证过程。可以在配置文件中设置策略,因此更改不需要修改源代码 - 从而降低了复杂性和维护工作量。

会话管理:

  • 基于POJO / J2SE(IoC友好) - Shiro中的所有内容(包括会话和会话管理的所有方面)都是基于接口的,并使用POJO实现。这允许您使用任何与JavaBeans兼容的配置格式(如JSON,YAML,Spring XML或类似机制)轻松配置所有会话组件。您还可以根据需要轻松扩展Shiro的组件或编写自己的组件,以完全自定义会话管理功能。

  • 会话存储 - 由于Shiro的Session对象是基于POJO的,因此会话数据可以轻松存储在任意数量的数据源中。这允许您准确自定义应用程序的会话数据所在的位置 - 例如,文件系统,企业缓存,关系数据库或专有数据存储。

  • 轻松而强大的群集 - 使用任何易于使用的网络缓存产品(如Ehcache,Coherence,GigaSpaces等),可以轻松地对Shiro的会话进行群集。人。这意味着您可以为Shiro配置一次且仅一次的会话群集,无论您部署到哪个Web容器,您的会话都将以相同的方式进行群集。无需特定于容器的配置!

  • 异构客户端访问 - 与EJB或Web会话不同,Shiro会话可以通过各种客户端技术“共享”。例如,桌面应用程序可以“看到”并“共享”同一用户在服务器端Web应用程序中使用的相同物理会话。我们不知道Shiro以外的任何框架都可以支持这一点。

  • 事件侦听器 - 事件侦听器允许您在会话的生命周期内侦听生命周期事件。您可以侦听这些事件并对它们做出反应以获取自定义应用程序行为 - 例如,在会话过期时更新用户记录。

  • 主机地址保留 - Shiro会话保留启动会话的主机的IP地址。这允许您确定用户所在的位置并做出相应的反应(主要用于IP关联是确定性的Intranet环境)。

  • 不活动/到期支持 - 会话由于预期的不活动而到期,但是touch()如果需要,可以通过一种方法延长它们以保持它们“活着”。这在用户可能正在使用桌面应用程序的Rich Internet Application(RIA)环境中很有用,但可能无法定期与服务器通信,但服务器会话不应过期。

  • 透明的Web使用 - Shiro的Web支持实现了HttpSession界面及其所有相关的API。这意味着您可以在现有Web应用程序中使用Shiro会话,而无需更改任何现有Web代码。

  • 可以用于SSO - 因为Shiro会话是基于POJO的,所以它们很容易存储在任何数据源中,并且如果需要,它们可以跨应用程序“共享”。这可用于提供简单的登录体验,因为共享会话可以保留身份验证状态。

网络集成:

  • 简单的ShiroFilter web.xml定义
    您可以在web.xml中使用一个简单的过滤器定义为Web应用程序启用Shiro。

  • 保护所有URL
    Shiro可以保护进入系统的任何类型的Web请求。例如,动态生成的页面,REST请求等。

  • 创新过滤(特定于URL的链)
    定义特定于URL的过滤器链比使用web.xml更容易,更直观,因为在Shiro中,您可以明确指定要为每个路径以及按什么顺序执行哪些过滤器。使用Shiro,您可以为该链中的每个过滤器设置特定于路径的配置。

  • JSP标记支持
    JSP标记允许您根据当前用户的状态和访问权限轻松控制页面输出。

  • 透明的HttpSession支持
    如果您使用的是Shiro的本机会话,我们已经实现了HTTP Session API和Servlet 2.5 API,因此您无需更改任何现有的Web代码即可使用Shiro。

INI主要构成:
[main]、[users]、[roles]、[urls]
具体详见:https://blog.csdn.net/shuaishuai1234/article/details/86160122

认证配置

[main]
...
#自定义认证实现方式
authenticator = com.foo.bar.CustomAuthenticator

securityManager.authenticator = $authenticator
#认证策略
authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy

securityManager.authenticator.authenticationStrategy = $authcStrategy
#自定义realm
blahRealm = com.company.blah.Realm
...
fooRealm = com.company.foo.Realm
...
barRealm = com.company.another.Realm
#显示指定多个realm
securityManager.realms = $blahRealm, $fooRealm, $barRealm

授权(权限)

主要有权限粒度

#全局的权限控制
globalPermissionResolver = com.foo.bar.authz.MyPermissionResolver
...
securityManager.authorizer.permissionResolver = $globalPermissionResolver

#域的权限控制
permissionResolver = com.foo.bar.authz.MyPermissionResolver
realm = com.foo.bar.realm.MyCustomRealm
realm.permissionResolver = $permissionResolver

#全局的角色权限控制
globalRolePermissionResolver = com.foo.bar.authz.MyPermissionResolver
...
securityManager.authorizer.rolePermissionResolver = $globalRolePermissionResolver

#角色权限控制
rolePermissionResolver = com.foo.bar.authz.MyRolePermissionResolver
realm = com.foo.bar.realm.MyCustomRealm
realm.rolePermissionResolver = $rolePermissionResolver

注解:
@RequiresAuthentication @RequiresGuest @RequiresPermissions @RequiresRoles @RequiresUser

领域证书匹配
customMatcher = com.company.shiro.realm.CustomCredentialsMatcher
myRealm = com.company.shiro.realm.MyRealm
myRealm.credentialsMatcher = $customMatcher

另一种领域证书匹配
...
credentialsMatcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
# base64 encoding, not hex in this example:
credentialsMatcher.storedCredentialsHexEncoded = false
credentialsMatcher.hashIterations = 1024
# This next property is only needed in Shiro 1.0\.  Remove it in 1.1 and later:
credentialsMatcher.hashSalted = true

...
myRealm = com.company.....
myRealm.credentialsMatcher = $credentialsMatcher

会话管理

#会话管理配置
sessionManager = com.foo.my.SessionManagerImplementation
securityManager.sessionManager = $sessionManager
#设置会话管理全局过期时间
securityManager.sessionManager.globalSessionTimeout = 3600000
#会话监听
aSessionListener = com.foo.my.SessionListener
anotherSessionListener = com.foo.my.OtherSessionListener
#SessionManager使用一个或多个侦听器实现配置
securityManager.sessionManager.sessionListeners = $aSessionListener, $anotherSessionListener, etc.

#会话存储,用户会话管理存储相关信息
sessionDAO = com.foo.my.SessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO

#自定义会话ID
#org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator
sessionIdGenerator = com.my.session.SessionIdGenerator
securityManager.sessionManager.sessionDAO.sessionIdGenerator = $sessionIdGenerator

#会话集群,集成Ehcache等等

参考文章:
集成spring:http://shiro.apache.org/spring.html
集成web:http://shiro.apache.org/web.html
session-management(集群):http://shiro.apache.org/session-management.html
shiro参考文档:https://shiro.apache.org/reference.html
shiro详细架构:https://shiro.apache.org/architecture.html
API:http://shiro.apache.org/static/1.4.0/apidocs/

https://jinnianshilongnian.iteye.com/blog/2049092
https://my.oschina.net/huangyong/blog/215153
http://shiro.apache.org/articles.html
http://shiro.apache.org/documentation.html
https://www.cnblogs.com/moonlightL/p/8126910.html

网站文章

  • 数据结构与算法-12爬楼梯

    Description 爬楼梯的时候,设每次可以上一级台阶或者两级台阶,计算上 n 级台阶的方案数。 Input 输入包含多组测试数据,对于每组测试数据: 输入只有一行为一个正整数 n(1 ≤ n ≤...

    2024-04-01 01:14:41
  • 服务器系统怎么设置第一启动项,服务器怎么设置启动项

    服务器系统怎么设置第一启动项,服务器怎么设置启动项

    服务器怎么设置启动项 内容精选换一换华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。您需要在源端服务...

    2024-04-01 01:14:14
  • 用python批量修改文本文件编码格式

    用python批量修改文本文件编码格式,比如gb2312转为utf8,可以自定义格式

    2024-04-01 01:14:08
  • 设计模式概述

    设计模式概述

    设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。它代表了软件设计最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案。

    2024-04-01 01:14:00
  • C++模板-35-类模板对象做函数参数的三种情况

    C++模板-35-类模板对象做函数参数的三种情况

    接着来学习类模板作为函数参数传入是如何使用,如果需要把类模板作为参数一起传入到函数中,一般有三种情况,下面分别用代码来解释这三种情况。 1.指定传入类型 就是在参数中,就指定类型,而不是, 而是直接指定确定类型,例如。看下面代码,在printPerson1()就是参数指定特定类型 #include #include using namespa.

    2024-04-01 01:13:53
  • Java--Exception in thread “main“ java.lang.ClassCastException: class jdk.internal.loader.ClassLoader

    Java--Exception in thread “main“ java.lang.ClassCastException: class jdk.internal.loader.ClassLoader

    报错如下: Exception in thread "main" java.lang.ClassCastException: class jdk.internal.loader.C...

    2024-04-01 01:13:28
  • 给初学者的 RxJava2.0 教程 (1-9)

    https://juejin.im/user/573dba2171cfe448aa97b7b0/posts

    2024-04-01 01:13:21
  • 计算机考研数学一用哪些书,2019计算机考研数学:常见三类参考书的使用方法...

    以下是新东方在线整理的2019计算机考研数学:常见三类参考书的使用方法,请参考:1.关于数学课本的学习方法记得当初复习的时候就听很多人说考研数学注重基础,数学课本如何如何重要,应该花大量时间去看。现在...

    2024-04-01 01:13:15
  • 多线程的三种启动方式

    多线程的三种启动方式

    2024-04-01 01:12:49
  • 根据运行端口查找可执行程序路径

    快速记录一个小点。 今天在加班联调时,需要重新部署一个服务,这个服务之前是某QA部署的。该服务部署在一台多人使用的测试机上,且有多套。 现在的需求就是在这台机器上找到正在运行的那一套,并停掉它,前提是...

    2024-04-01 01:12:42