Shiro是一个功能强大的Java安全框架,可以用于身份验证、授权、会话管理等安全相关的处理。在Shiro中,过滤器链(Filter Chain)和拦截器(Interceptors)是实现安全控制的关键部分。
过滤器链
过滤器链是Shiro中用于处理请求的核心机制之一。当请求到达应用程序时,Shiro会根据配置的过滤器链对请求进行处理。过滤器链由多个过滤器组成,每个过滤器负责一种特定的任务。
Shiro的过滤器链是按照顺序执行的,每个过滤器都有机会进行处理。过滤器链的顺序由配置文件中的filterChainDefinitions
属性决定。在处理请求时,Shiro会根据请求的URL与过滤器链的配置进行匹配,找到匹配的过滤器链后,依次执行其中的过滤器。
常用的 Shiro 过滤器有:
anon
:匿名过滤器,用于处理不需要身份验证的请求,允许用户匿名访问。authc
:认证过滤器,用于进行用户身份验证,要求用户在访问受保护资源之前先进行身份验证。perms
:授权过滤器,用于进行权限控制,要求用户必须拥有指定的权限才能访问资源。roles
:角色过滤器,用于进行角色控制,要求用户必须拥有指定的角色才能访问资源。logout
:登出过滤器,用于处理用户退出登录的请求。
过滤器链的配置示例:
[urls]
/login = anon
/admin/** = authc, perms["admin:manage"]
以上的配置表示/login
路径可以匿名访问,/admin/**
路径需要进行身份验证,并且必须拥有admin:manage
权限。
拦截器
拦截器是Shiro中的另一个重要概念,用于在处理请求的各个阶段插入特定的逻辑。与过滤器不同,拦截器可以拦截处理逻辑并进行特定的处理,例如记录日志、处理异常等。
在Shiro中,拦截器是与过滤器链结合使用的。通过配置拦截器,可以在过滤器链的处理过程中加入自定义的逻辑。
常用的 Shiro 拦截器有:
AuthenticationInterceptor
:用于处理身份验证相关逻辑,例如登录失败处理、跳转到登录页面等。AuthorizationInterceptor
:用于处理权限控制相关逻辑,例如拦截没有权限的请求、跳转到无权限页面等。ExceptionInterceptor
:用于处理异常情况,例如记录异常日志、返回特定的错误信息等。
拦截器的配置示例:
@Bean
public AuthorizationInterceptor authorizationInterceptor() {
return new AuthorizationInterceptor();
}
@Bean
public ExceptionInterceptor exceptionInterceptor() {
return new ExceptionInterceptor();
}
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
// ...
Map<String, Filter> filters = new LinkedHashMap<>();
filters.put("authc", authenticationInterceptor());
filters.put("perms", authorizationInterceptor());
filters.put("exception", exceptionInterceptor());
shiroFilterFactoryBean.setFilters(filters);
// ...
}
以上的配置示例中,添加了 AuthenticationInterceptor
、AuthorizationInterceptor
和 ExceptionInterceptor
三个拦截器,分别处理身份验证、权限控制和异常情况。
总结
Shiro中的过滤器链和拦截器是实现安全控制的重要组成部分。过滤器链用于按照顺序处理请求,每个过滤器负责一种特定的任务;拦截器则可以在过滤器链的处理过程中加入自定义的逻辑。通过配置适合应用程序需求的过滤器链和拦截器,可以灵活地实现身份验证、权限控制和异常处理等安全相关的功能。
本文来自极简博客,作者:每日灵感集,转载请注明原文链接:Shiro中的过滤器链与拦截器