安全框架shiro的基础知识

阅读: 评论:0

安全框架shiro的基础知识

安全框架shiro的基础知识

 推荐文章

安全框架对比:shiro vs spring-security_陈海龙的格物之路-CSDN博客shiro和spring-security都是安全框架,两者有哪些相同点和差异呢?。

目标

通过阅读这篇文章,你可以了解到shiro是什么、shiro的架构、shiro如何支持web环境的安全验证等。

what

shiro作为安全框架,保证应用程序可以安全的使用,针对认证、授权、加密、session管理提供了综合解决方案。 

架构

直接看图

组件介绍

组件名简介
Subject与应用进行交互的用户视图。shiro以Subject为中心提供API。
SecurityManager

作为shiro架构的核心,负责协调各种组件开展工作。

Authenticator负责用户登录时的身份认证。协调一个或多个Realms以获取用户信息,由Authentication Strategy决定身份认证的结果。
Authorizer负责用户的授权验证。协调一个或多个数据源以获取角色权限信息,然后进行访问控制。
SessionManager

负责创建和管理用户session。

与其他安全框架相比,shiro有个独特特性,即无论什么环境(不仅仅是web容器),都能提供健壮的session体验。

SessionDAO,负责session持久化。

CacheManager创建和管理Cache实例,以便其他shiro组件使用。shiro在提供身份认证、授权验证、session管理的能力时,提供了多种数据源支持,为了提升性能,使用cache时必然的要求,而且支持多种cache框架。
Realms作为shiro与数据源之间的桥梁,将两者联系起来。身份认证、授权验证,shiro都需要通过Realms去读取数据。

身份认证

术语

subject与应用进行交互的实体(用户第三方服务定时任务)的安全视图  用户指与应用程序交互的任何事物、
principals当事人,subject的识别属性
credentials凭证,用于身份验证的机密数据
realms代表访问接口,用于访问存储安全信息的后端数据源,例如DAO。每个realm对应一个数据源。

认证流程

  1. 收集subject的识别属性和机密数据
  2. 向认证系统提交收集的数据
  3. 结果:允许访问、再次认证、拒绝访问 

授权验证

三个元素:权限、角色、用户

权限细粒度的安全策略,可作为能力的描述,代表可以在系统中做什么。
角色代表一批权限,简便管理权限和用户的关系
用户应用的访问者,shiro使用subject代表一个用户。

控制方式

编码 

  • 角色检查
    • subject.hasRole("role")
  • 权限检查
    • subject.isPermitted(Permission)
    • subject.isPermitted("PermissionPath") 

注解(方法级别 )

  • @RequiresPermissions("account:create")
  • @RequiresRoles( "teller" ) 

原理

提供web支持

ShiroWebAutoConfiguration

  • autoconfig的配置 
@Configuration
@AutoConfigureBefore(ShiroAutoConfiguration.class)
@AutoConfigureAfter(ShiroWebMvcAutoConfiguration.class)
@ConditionalOnProperty(name = "abled", matchIfMissing = true)
  • 生成DefaultWebSecurityManager bean,以及生成各种可扩展的bean default实例。

ShiroWebFilterConfiguration

  • ShiroFilterFactoryBean作为提供SpringShiroFilter实例的工厂。
  • 注册SpringShiroFilter,其继承AbstractShiroFilter。

shiroFilter内部可以调用filters

public enum DefaultFilter {anon(AnonymousFilter.class),authc(FormAuthenticationFilter.class),authcBasic(BasicHttpAuthenticationFilter.class),authcBearer(BearerHttpAuthenticationFilter.class),logout(LogoutFilter.class),noSessionCreation(NoSessionCreationFilter.class),perms(PermissionsAuthorizationFilter.class),port(PortFilter.class),rest(HttpMethodPermissionFilter.class),roles(RolesAuthorizationFilter.class),ssl(SslFilter.class),user(UserFilter.class),invalidRequest(InvalidRequestFilter.class);
}

通过定义ShiroFilterChainDefinition Bean,可以自定义配置url使用哪些filter。

@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();/** 按照添加顺序进行匹配,建议之前的urlPattern不要包含之后的urlPattern*/// 使用authc、roles filters, 即需要登录,且角色adminchainDefinition.addPathDefinition("/demo/**", "authc, roles[admin]");// 使用authc、logout filters,需要登录chainDefinition.addPathDefinition("/logout", "authc, logout");// 使用authc filters,需要登录,不做授权验证chainDefinition.addPathDefinition("/**", "authc");return chainDefinition;}

InvalidRequestFilter

  • 检查URL path,拒绝分号、反斜杆、非ascii码字符

FormAuthenticationFilter

处理的请求为:POST 且 loginUrl。

流程

  • 获取username password数据,组装成usernamePasswordToken
  • 从上下文读取(组装)subject,WebDelegatingSubject
  • 调用subject.login(AuthenticationToken)
    • securityManager.login(subject,token)
      • authenticator.authenticate(token)
        • realm获取用户信息并进行身份认证
      • 认证成功则新建subject

若欲详细查看流程,我建议的debug起点 

org.apache.shiro.web.servlet.AbstractShiroFilter#doFilterInternal 

DefaultWebSessionManager

  • sessionId存储到cookie
  • 依赖SessionDAO读取session

注解支持

主要类作用
ShiroAnnotationProcessorAutoConfiguration支持shiro注解而进行的配置
AuthorizationAttributeSourceAdvisor定义切面:关注点(joinPoint)作为匹配器的筛选条件,匹配结果作为切入点(pointCut),且需要提供个性化切面行为(advice),构成一个advisor。
AopAllianceAnnotationsAuthorizingMethodInterceptor切面行为advice  由注解对应的拦截器构成拦截器责任链,遍历拦截器进行授权检测
MethodInterceptor实现invoke(MethodInvocation),在原行为前后添加自定义行为。

自定义扩展

Realm

定义如何获取安全数据,如用户、权限。

不建议直接实现该接口,而是建议继承AuthenticatingRealm或AuthorizingRealm。

继承类AuthenticatingRealm,可方便实现获取身份信息的realm,实现抽象方法doGetAuthenticationInfo,例如返回SimpleAuthenticationInfo。

继承类AuthorizingRealm,可方便实现获取身份信息和角色权限信息的realm。实现抽象方法doGetAuthenticationInfo,返回值参考SimpleAuthorizationInfo。实现抽象方法doGetAuthenticationInfo,例如返回SimpleAuthenticationInfo。

SessionDAO

自定义如何存取session,可继承AbstractSessionDAO。

参考

Apache Shiro | Simple. Java. Security..html

你还可查看

安全框架对比:shiro vs spring-security_陈海龙的格物之路-CSDN博客shiro和spring-security都是安全框架,两者有哪些相同点和差异呢?。

本文发布于:2024-01-29 03:13:04,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170646918712288.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:基础知识   框架   shiro
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23