原来SpringSecurity整合OAuth2后开放权限拦截路径还能这么玩?

简介: 当我们整合了`Spring Security`以及`OAuth2`后发现,有一些业务请求是需要开放的,因为种种原因这时访问者还没有身份标识(`比如:用户刚来,还没有注册,需要进行新用户注册,这时注册业务相关的接口都应该是开放的`),下面我们来看看`ApiBoot`是怎么排除路径不进行权限拦截的。

当我们整合了Spring Security以及OAuth2后发现,有一些业务请求是需要开放的,因为种种原因这时访问者还没有身份标识(比如:用户刚来,还没有注册,需要进行新用户注册,这时注册业务相关的接口都应该是开放的),下面我们来看看ApiBoot是怎么排除路径不进行权限拦截的。

官方相关文档

相关ApiBoot Security官方使用文档,请访问 ApiBoot Security

在文档的第4. 默认排除路径部分,我们了解到了ApiBoot Security为了与其他的第三方框架进行集成,在内部已经添加了一些默认的拦截路径,当我们在添加开放路径时会在默认的基础上增量添加,不会覆盖

创建项目

我们使用IDEA开发工具创建一个SpringBoot项目,在pom.xml内添加相关的依赖,如下所示:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <!--ApiBoot Security OAuth安全组件-->
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
  </dependency>

</dependencies>
<dependencyManagement>
  <dependencies>
    <!--ApiBoot统一版本依赖-->
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

排除路径配置

ApiBoot Security OAuth安全组件默认拦截配置为/api/**,也就是/api下的全部路径以及子路径都需要认证后才可以访问。

我们可以通过api.boot.security.auth-prefix参数配置修改保护的路径列表ApiBoot还提供了另外的一个参数配置api.boot.security.ignoring-urls,用于配置开放的路径列表(开放路径可直接访问,不走权限拦截),支持使用Ant风格,application.yml配置内容如下所示:

spring:
  application:
    name: apiboot-security-open-paths-without-intercept
server:
  port: 9090

api:
  boot:
    # ApiBoot Security安全配置
    security:
      # 权限拦截的路径前缀
      auth-prefix: /**
      # 排除不拦截的路径
      ignoring-urls:
        - /index/**

我们在application.yml文件内配置api.boot.security.ignoring-urls的值为/index/**,这时我们在访问/index/index/xxx路径时都不会经过权限的拦截,直接可以访问到。

示例请求

我们来创建一个名为IndexController的示例控制器,来验证我们开放的路径是否已经生效了,如下所示:


/**
 * 示例:控制器
 *
 * @author 恒宇少年
 */
@RestController
@RequestMapping(value = "/index")
public class IndexController {
    /**
     * 示例:首页地址
     * /index
     *
     * @return
     */
    @GetMapping
    public String index() {
        return "this is index page.";
    }

    /**
     * 示例:首页地址子页面
     * /index/sub
     *
     * @return
     */
    @GetMapping(value = "/sub")
    public String indexSub() {
        return "this is sub index page.";
    }
}

application.yml我们配置的开放地址为/index/**,所以IndexController控制器内的两个地址/index/index/sub都会被开放,不走权限拦截,直接放行。

运行测试

我们使用IDEA通过XxxApplication入口类的方式来启动本章项目源码,下面是我们要验证的测试点。

测试点:开放路径

我们先来访问下http://localhost:9090/index,效果如下所示:

➜ ~ curl http://localhost:9090/index    
this is index page.

直接访问/index是可以直接获取接口返回的内容,这也证明了一点,这个地址被开放了,不再被权限拦截。

在之前说到ApiBoot Security OAuth开放地址支持Ant风格,我们配置的开放地址为/index/**,所以/index/sub这个请求地址也应该已经被开放了,效果如下所示:

➜ ~ curl http://localhost:9090/index/sub
this is sub index page.
如果我们修改 api.boot.security.ignoring-urls配置为 /index,我们在访问 /index/sub这个地址时是没有权限的,需要携带有效的 AccessToken才可以访问到。

测试点:未开放路径的拦截

下面我们来完成一个比较特殊的测试点,访问一个并没有在后台定义的路径,如下所示:

➜ ~ curl http://localhost:9090/index/11
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}

我们并没有添加/index/xx这个请求地址的实现,当访问时同样也会被拦截,这证明了我们发起的请求并没有到达解析请求就已经被权限拦截了。

敲黑板,划重点

除了被开放的路径都需要提供有效的AccessToken才可以访问,无论这个地址是否存在,本章为了示例讲解方便我这里配置的权限拦截根地址为/**api.boot.security.auth-paths参数源码是一个数组(详见:org.minbox.framework.api.boot.autoconfigure.security.ApiBootSecurityProperties),可以配置多个地址,比如:/user/**/order/**api.boot.security.ignoring-urls同样支持数组形式配置多个。

代码示例

如果您喜欢本篇文章请为源码仓库点个Star,谢谢!!!
本篇文章示例源码可以通过以下途径获取,目录为apiboot-security-open-paths-without-intercept

相关文章
|
7月前
|
JSON 安全 关系型数据库
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
|
7月前
|
数据库 数据安全/隐私保护
SpringSecurity请求授权规则配置与注解使用说明
SpringSecurity请求授权规则配置与注解使用说明
82 0
|
存储 NoSQL Java
SpringBoot自定义实现类似jwt权限验证效果
SpringBoot自定义实现类似jwt权限验证效果
96 0
|
SQL 安全 Java
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目的需求来决定使用哪一种.
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
springboot整合shiro (二) 使用shiro过滤器实现认证资源拦截
springboot整合shiro (二) 使用shiro过滤器实现认证资源拦截
293 0
|
安全 Java Apache
Springboot整合shiro:实现用户登录和权限验证
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。当然类型大家也可以使用spring security;因为我平时开发的项目都是中小型的,所以使用shiro对于业务来说已经够用了,那么下面是我整理的整合记录;
163 0
|
JavaScript 安全 Java
Spring Security-访问控制url匹配
Spring Security-访问控制url匹配
Spring Security-访问控制url匹配
|
安全 Java 数据安全/隐私保护
Spring Security-内置访问控制方法介绍和角色权限判断
Spring Security-内置访问控制方法介绍和角色权限判断
Spring Security-内置访问控制方法介绍和角色权限判断
|
前端开发 Java 数据安全/隐私保护
SpringMVC拦截器实现登录权限控制
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。 依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于 web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller生命周期之内可以多次调用。
|
SQL 安全 Java
见过这么简单的方式整合SpringSecurity & OAuth2的自定义查询用户吗?
`SpringSecurity`整合`OAuth2`是开发者公认的`资源保护`、`服务认证`的最佳搭配伙伴,这对好基友一直在默默的守护着应用服务的安全,根据访问者的不同角色可以颗粒度控制到具体的接口,从而实现权限的细微划分。