推荐文章
安全框架对比:shiro vs spring-security_陈海龙的格物之路-CSDN博客shiro和spring-security都是安全框架,两者有哪些相同点和差异呢?。
通过阅读这篇文章,你可以了解到shiro是什么、shiro的架构、shiro如何支持web环境的安全验证等。
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对应一个数据源。 |
认证流程
三个元素:权限、角色、用户
权限 | 细粒度的安全策略,可作为能力的描述,代表可以在系统中做什么。 |
角色 | 代表一批权限,简便管理权限和用户的关系 |
用户 | 应用的访问者,shiro使用subject代表一个用户。 |
控制方式
编码
注解(方法级别 )
ShiroWebAutoConfiguration
@Configuration
@AutoConfigureBefore(ShiroAutoConfiguration.class)
@AutoConfigureAfter(ShiroWebMvcAutoConfiguration.class)
@ConditionalOnProperty(name = "abled", matchIfMissing = true)
ShiroWebFilterConfiguration
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
FormAuthenticationFilter
处理的请求为:POST 且 loginUrl。
流程
若欲详细查看流程,我建议的debug起点
org.apache.shiro.web.servlet.AbstractShiroFilter#doFilterInternal
DefaultWebSessionManager
主要类 | 作用 |
ShiroAnnotationProcessorAutoConfiguration | 支持shiro注解而进行的配置 |
AuthorizationAttributeSourceAdvisor | 定义切面:关注点(joinPoint)作为匹配器的筛选条件,匹配结果作为切入点(pointCut),且需要提供个性化切面行为(advice),构成一个advisor。 |
AopAllianceAnnotationsAuthorizingMethodInterceptor | 切面行为advice 由注解对应的拦截器构成拦截器责任链,遍历拦截器进行授权检测 |
MethodInterceptor | 实现invoke(MethodInvocation),在原行为前后添加自定义行为。 |
定义如何获取安全数据,如用户、权限。
不建议直接实现该接口,而是建议继承AuthenticatingRealm或AuthorizingRealm。
继承类AuthenticatingRealm,可方便实现获取身份信息的realm,实现抽象方法doGetAuthenticationInfo,例如返回SimpleAuthenticationInfo。
继承类AuthorizingRealm,可方便实现获取身份信息和角色权限信息的realm。实现抽象方法doGetAuthenticationInfo,返回值参考SimpleAuthorizationInfo。实现抽象方法doGetAuthenticationInfo,例如返回SimpleAuthenticationInfo。
自定义如何存取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小时内删除。
留言与评论(共有 0 条评论) |