一、背景
在我们实际的开发过程中,有些时候可能存在这么一些情况,某些api 比如: /api/**
这些是给App端使用的,数据的返回都是以JSON的格式返回,且这些API的认证方式都是使用的TOKEN进行认证。而除了 /api/**
这些API之外,都是给网页端使用的,需要使用表单认证,给前端返回的 都是某个页面。
二、需求
1、给客户端使用的api
1.拦截 /api/**
所有的请求。2./api/**
的所有请求都需要ROLE_ADMIN
的角色。3.从请求头中获取 token
,只要获取到token
的值,就认为认证成功,并赋予ROLE_ADMIN
到角色。4.如果没有权限,则给前端返回JSON对象 {message:"您无权限访问"}
5.访问 /api/userInfo
端点1.请求头携带 token
可以访问。2.请求头不携带token
不可以访问。
2、给网站使用的api
1.拦截 所有的请求,但是不处理/api/**
开头的请求。
2.所有的请求需要ROLE_ADMIN
的权限。
3.没有权限,需要使用表单登录。
4.登录成功后,访问了无权限的请求,直接跳转到百度去。
5.构建2个内建的用户1.用户一: admin/admin 拥有 ROLE_ADMIN 角色2.用户二:dev/dev 拥有 ROLE_DEV 角色
6.访问 /index
端点1.admin
用户访问,可以访问。2.dev
用户访问,不可以访问,权限不够。
三、实现方案
方案一:
直接拆成多个服务,其中 /api/**
的成为一个服务。非/api/**
的拆成另外一个服务。各个服务使用自己的配置,互不影响。
方案二
在同一个服务中编写。不同的请求使用不同的SecurityFilterChain
来实现。
经过考虑,此处采用
方案二
来实现,因为方案一简单,使用方案二实现,也可以记录下在同一个项目中 通过使用多条过滤器链,因为并不是所有的时候,都是可以分成多个项目的。
扩展:
1、Spring Security SecurityFilterChain
的结构
2、控制 SecurityFilterChain
的执行顺序
使用 org.springframework.core.annotation.Order
注解。
3、查看是怎样选择那个 SecurityFilterChain
的
查看 org.springframework.web.filter.DelegatingFilterProxy#doFilter