若依框架免token访问

Sabthever

若依框架的简单使用中,已经简单介绍了一下SecurityUtils这个类的作用,并且简单的阐述了一下其中方法的使用。

近段时间有个项目要求没有任何登录就能够访问,而若依框架本身对于每一个接口都会进行token的判断,以此来获取当前用户信息以及是否有权限访问。这个切片的控制实际上由Security机制来控制的。

这个中间的token判断、ip判断、权限判断等等,都可以在SecurityConfigconfigure方法中来配置,这个方法原型如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* anyRequest | 匹配所有请求路径
* access | SpringEl表达式结果为true时可以访问
* anonymous | 匿名可以访问
* denyAll | 用户不能访问
* fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录)
* hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问
* hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问
* hasAuthority | 如果有参数,参数表示权限,则其权限可以访问
* hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问
* hasRole | 如果有参数,参数表示角色,则其角色可以访问
* permitAll | 用户可以任意访问
* rememberMe | 允许通过remember-me登录的用户访问
* authenticated | 用户登录后可访问
*/
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
// 注解标记允许匿名访问的url
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll());

httpSecurity
// CSRF禁用,因为不使用session
.csrf().disable()
// 禁用HTTP响应标头
.headers().cacheControl().disable().and()
// 认证失败处理类
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// 基于token,所以不需要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 过滤请求
.authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
// 添加Logout filter
httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
// 添加JWT filter
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 添加CORS filter
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
}

可以看到其中有很多配置选项,具体可以自己查看一下。

我们如果不需要token就能够对接口进行直接的访问,根据上面的内容,我们可以把configure改成如下。

1
2
3
4
5
6
7
8
9
10
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 禁用CSRF保护
.csrf().disable()
// 不需要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 对所有请求允许访问
.authorizeRequests().anyRequest().permitAll();
}

其他的一些配置要求,也可以一起来看一下。

HttpSecurity 配置方法详解

在使用 Spring Security 时,HttpSecurity 是一个核心类,用于配置基于 HTTP 请求的安全策略。通过 HttpSecurity,我们可以灵活地定义哪些请求需要进行身份验证、哪些请求需要特定的角色或权限,以及如何处理各种安全相关的细节。

常见配置方法

1
2
3
4
>http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated();

anyRequest

  • 描述:匹配所有请求路径。

  • 示例

    1
    >.anyRequest().authenticated()
  • 说明:如果没有其他更具体的匹配规则,所有请求都将应用此规则。

access

  • 描述:SpringEl 表达式结果为 true 时可以访问。

  • 示例

    1
    >.antMatchers("/api/**").access("hasRole('ADMIN') or hasRole('USER')")
  • 说明:可以使用复杂的 SpringEl 表达式来定义访问规则。

anonymous

  • 描述:匿名可以访问。

  • 示例

    1
    >.antMatchers("/guest/**").anonymous()
  • 说明:允许未登录的用户访问指定路径。

denyAll

  • 描述:用户不能访问。

  • 示例

    1
    >.antMatchers("/secure/**").denyAll()
  • 说明:完全禁止访问指定路径。

fullyAuthenticated

  • 描述:用户完全认证可以访问(非 remember-me 下自动登录)。

  • 示例

    1
    >.antMatchers("/admin/**").fullyAuthenticated()
  • 说明:只有通过完整认证的用户(非 remember-me 登录)可以访问。

hasAnyAuthority

  • 描述:如果有参数,参数表示权限,则其中任何一个权限可以访问。

  • 示例

    1
    >.antMatchers("/api/**").hasAnyAuthority("ROLE_ADMIN", "ROLE_USER")
  • 说明:用户拥有任何一个指定权限即可访问。

hasAnyRole

  • 描述:如果有参数,参数表示角色,则其中任何一个角色可以访问。

  • 示例

    1
    >.antMatchers("/api/**").hasAnyRole("ADMIN", "USER")
  • 说明:用户拥有任何一个指定角色即可访问。

hasAuthority

  • 描述:如果有参数,参数表示权限,则其权限可以访问。

  • 示例

    1
    >.antMatchers("/api/admin/**").hasAuthority("ROLE_ADMIN")
  • 说明:用户必须拥有指定权限才能访问。

hasIpAddress

  • 描述:如果有参数,参数表示 IP 地址,如果用户 IP 和参数匹配,则可以访问。

  • 示例

    1
    >.antMatchers("/api/**").hasIpAddress("192.168.1.1")
  • 说明:只有来自指定 IP 地址的用户可以访问。

hasRole

  • 描述:如果有参数,参数表示角色,则其角色可以访问。

  • 示例

    1
    >.antMatchers("/api/admin/**").hasRole("ADMIN")
  • 说明:用户必须拥有指定角色才能访问。

permitAll

  • 描述:用户可以任意访问。

  • 示例

    1
    >.antMatchers("/public/**").permitAll()
  • 说明:允许所有用户(包括未登录用户)访问指定路径。

rememberMe

  • 描述:允许通过 remember-me 登录的用户访问。

  • 示例

    1
    >.antMatchers("/api/user/**").rememberMe()
  • 说明:允许通过 remember-me 功能自动登录的用户访问。

authenticated

  • 描述:用户登录后可访问。

  • 示例

    1
    >.antMatchers("/api/**").authenticated()
  • 说明:用户必须登录后才能访问。

其他配置要求

除了上述常见的配置方法,HttpSecurity 还提供了许多其他配置选项,用于处理各种安全相关的细节。以下是一些常见的配置要求和示例:

登录和注销

  • 登录配置

    1
    2
    3
    4
    5
    >http
    .formLogin()
    .loginPage("/login")
    .defaultSuccessUrl("/home", true)
    .permitAll();
  • 注销配置

    1
    2
    3
    4
    5
    >http
    .logout()
    .logoutUrl("/logout")
    .logoutSuccessUrl("/login?logout")
    .permitAll();

CSRF 保护

  • 启用 CSRF 保护
1
2
3
http
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
  • 禁用 CSRF 保护

    1
    2
    3
    http
    .csrf()
    .disable();

CORS 配置

  • 启用 CORS

    1
    2
    3
    4
    5
    >http
    .cors()
    .and()
    .csrf()
    .disable();

异常处理

  • 自定义异常处理
1
2
3
4
http
.exceptionHandling()
.accessDeniedPage("/403")
.authenticationEntryPoint(new CustomAuthenticationEntryPoint());

安全上下文

  • 配置安全上下文

    1
    2
    3
    http
    .securityContext()
    .securityContextRepository(new CustomSecurityContextRepository());

总结

通过 HttpSecurity,我们可以灵活地配置 Spring Security 的各种安全策略。从简单的访问控制到复杂的异常处理,HttpSecurity 提供了丰富的配置选项,满足不同项目的需求。更多详细信息可以参考 Spring Security 官方文档

  • 标题: 若依框架免token访问
  • 作者: Sabthever
  • 创建于 : 2025-06-03 16:02:06
  • 更新于 : 2025-06-04 10:12:01
  • 链接: https://sabthever.online/2025/06/03/technology/java/若依框架免token访问/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。