Shiro中的过滤器链与拦截器

每日灵感集 2019-03-15 ⋅ 14 阅读

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);
    // ...
}

以上的配置示例中,添加了 AuthenticationInterceptorAuthorizationInterceptorExceptionInterceptor 三个拦截器,分别处理身份验证、权限控制和异常情况。

总结

Shiro中的过滤器链和拦截器是实现安全控制的重要组成部分。过滤器链用于按照顺序处理请求,每个过滤器负责一种特定的任务;拦截器则可以在过滤器链的处理过程中加入自定义的逻辑。通过配置适合应用程序需求的过滤器链和拦截器,可以灵活地实现身份验证、权限控制和异常处理等安全相关的功能。


全部评论: 0

    我有话说: