您的位置:

Shiro配置不拦截请求

Shiro是一个用于身份验证、授权、加密、会话管理等的Java的安全框架,为Java应用程序提供安全认证和授权支持。在实际开发过程中,除了需要进行身份验证和授权认证外,还需要对一些请求进行不拦截处理。本文将从以下几个方面对Shiro配置不拦截的请求做详细的阐述。

一、配置不拦截的请求

Shiro提供了对某些请求不拦截的配置,只需要在shiro.ini或shiro.xml配置文件中进行如下配置即可:

[urls]
/login.jsp = anon
/logout = logout 
/** = authc  

其中:

  • "/login.jsp":不需要身份验证的请求,即允许匿名访问的请求。
  • "/logout":登出请求,当用户请求登出时,Shiro将自动清除用户的身份信息以及相关的会话信息。
  • "/**":所有请求都需要进行身份验证。

在Shiro中,"anon"表示匿名访问,"logout"表示登出请求,"authc"表示身份验证请求。

例如:

[main]
...
[urls]
/logout = logout
/index.jsp = anon
/** = authc

这个配置表示匿名访问"/index.jsp",清除用户信息请求"/logout",其他所有请求都需要进行身份验证。

二、自定义拦截器

在Shiro中,如果默认的Filter无法满足我们的需求,我们可以通过自定义Filter进行扩展。

步骤如下:

  1. 定义一个Filter类,继承Shiro中的org.apache.shiro.web.filter.authc.FormAuthenticationFilter类,并重写其中的onPreHandle()方法。
  2. 在shiro.ini或shiro.xml文件中添加Filter定义。
  3. 添加过滤器配置。

例如:

定义一个CustomFormAuthenticationFilter类,代码如下:

public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {
 
    @Override
    protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        // 判断是否为登录请求
        if (isLoginSubmission(request, response)) {
            // 处理登录请求
            return executeLogin(request, response);
        } else {
            // 其他请求不进行拦截
            return true;
        }
    }
}

在shiro.ini文件中添加以下内容:

# 添加Filter定义
[filters]
customFilter = org.example.CustomFormAuthenticationFilter

# 添加过滤器配置
[urls]
/login = customFilter
/logout = logout
/** = authc

这个配置表示对"/login"请求使用自定义的CustomFormAuthenticationFilter过滤器,清除用户信息请求"/logout",其他所有请求都需要进行身份验证。

三、使用注解实现不拦截

在Shiro中,我们还可以使用注解的方式来实现对某些请求的不拦截。

步骤如下:

  1. 在pom.xml文件中引入依赖项。
  2. 在shiro.ini或shiro.xml文件中进行配置。
  3. 在Controller中使用@RequiresPermissions注解标注不拦截的请求。

例如:

在pom.xml文件中添加Shiro-annotations依赖:

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-annotations</artifactId>
  <version>1.2.5</version>
</dependency>

在shiro.ini文件中添加以下内容:

# 开启注解支持
[main]
shiro.annotations.enabled = true
 
# 添加过滤器配置
[urls]
/logout = logout
/** = authc

在Controller中使用@RequiresPermissions注解标注不拦截的请求:

@Controller
public class UserController {
 
    /**
     * 不需要进行身份验证的请求
     */
    @RequestMapping("/index")
    @RequiresPermissions(value = "index:view", logical = Logical.OR)
    public String index() {
        return "index";
    }
 
    /**
     * 需要进行身份验证的请求
     */
    @RequestMapping("/user/list")
    @RequiresPermissions(value = "user:view", logical = Logical.OR)
    public String userList() {
        return "userList";
    }
}

这个配置表示对"/index"请求不进行身份验证,对"/user/list"请求需要进行身份验证。

四、总结

通过上述的介绍,我们可以了解如何在Shiro中配置不拦截的请求,还可以使用自定义Filter和注解的方式实现对某些请求的不拦截。这些功能的使用可以根据实际的业务需求进行选择,有助于提高开发效率和编写更加安全的Java应用程序。