前期准备工作完成后,现在开始搭建项目,今天主要完成项目的搭建和基本功能的调试。
工程结构
@Component
@Log4j2
public class StockRequestGlobalFilter implements GlobalFilter, Ordered {
/**
* 通过filter来自定义配置转发信息
* @param exchange
* @param chain
* @return
*/
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String authentication = exchange.getRequest().getHeaders().getFirst("Authorization");
if(!StringUtil.isNullOrEmpty(authentication)){
log.info("enter stockRequestGlobalFilter filter method: " + authentication);
exchange.getRequest().mutate().header("Authorization",authentication);
}
return chain.filter(exchange.mutate().build());
}
@Override
public int getOrder() {
return -1000;
}
}
网关配置:
server:
port: 10680
spring:
application:
name: stock-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
service: stock-gateway
gateway:
discovery:
# 允许通过服务名称进行路由转发访问, http://service-id/user
locator:
enabled: true
# 路由配置
routes:
- id: stock-user
uri: lb://stock-user
predicates:
- Path=/user/**
- id: trade-auth
uri: lb://trade-auth
predicates:
# - Method=GET,POST 不要开启此项
- Path=/oauth/**
logging:
level:
root: info
经过实践摸索,如果网关只是转发,按照我们OAUTH2的设计方案, Spring Cloud Gateway 可以不用集成Spring Security。网关的职责就是接收客户端的请求并进行转发, 所以鉴权可以不用放置在网关, 各微服务直接作为资源服务进行认证,也可以避免微服务直接对外暴露产生的安全问题, 在这里学习如何通过Gateway转发请求, 实现OAuth2的认证。
server:
port: 10681
spring:
application:
name: stock-user
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
sentinel:
transport:
# Sentinel管理后台的连接配置
dashboard: 127.0.0.1:8858
datasource:
# 用户的降级规则配置:
user-degrade:
nacos:
server-addr: 127.0.0.1:8848
dataId: sentinel-user-degrade
groupId: DEFAULT_GROUP
data-type: json
rule-type: degrade
#用户限流的规则配置:
user-flow:
nacos:
server-addr: 127.0.0.1:8848
dataId: sentinel-user-flow
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
# 数据源配置, 采用Druid
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root12349876
url: jdbc:mysql://106.14.250.251:3306/trade_stock?useUnicode=true&characterEncoding=UTF-8&useSSL=false
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow:
# IP黑名单 (存在共同时,deny优先于allow)
deny:
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: admin123
# 监控后台开关, 开启可通过后台管理查看
enabled: true
## spring security 配置
security:
oauth2:
resource:
loadBalanced: true
token-info-uri: http://trade-auth/oauth/check_token
client:
client-id: app
client-secret: app
scope: server
access-token-uri: http://trade-auth/oauth/token
user-authorization-uri: http://trade-auth/oauth/authorize
#mybatis 配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
auto-mapping-behavior: full
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations:
- classpath:com/itcast/bulls/stock/user/dao/mapper/*.xml
- classpath:com/itcast/bulls/stock/common/system/dao/mapper/*Mapper.xml
global-config:
# 逻辑删除配置
db-config:
# 删除前
logic-not-delete-value: 1
# 删除后
logic-delete-value: 0
主要是stat-view-servlet下面配置:
url-pattern是配置监控台的访问地址。
allow是允许哪些IP进行访问。
deny是IP黑名单, 优先级高于allow。
reset-enable是复位功能, 谨慎使用。
login-username是登陆了用户名。
login-password是登陆密码。
enabled是监控台的启用开关, 此项一定要开启。
启动服务即可访问, 把用户服务启动, 访问地址: http://127.0.0.1:10681/druid/index.html
项目结构
申请token
新建一个请求, 输入地址: 127.0.0.1:9999/oauth/token
选择认证方式, 填入Client的用户与密码信息,非t_trade_user信息。
填入grant_type, 认证模式; username和password对应t_trade_user表信息,scope作用域对应client用户的scope, 不能填错。
采用post和get方式请求都可以, 返回结果可以看到有两部分, 一部分是内置的token信息, 另外一部分就是我们自定义增强的token扩展信息。
刷新token, 地址不变, 需要传递refresh_token, 这个在申请token时可以拿到, grant_type类型要设置为refresh_token。
刷新成功, 和上面申请的token值发生了变化, access_token已重新生成。
http://106.14.250.251:8858/#/dashboard/home 账号密码:sentinel
现在主要配置限流和降级规则,规则配置在nacos
sentinel如果部署到服务器上,本地启动项目时无法实时监控到的。
原因:Sentinel的监控需要双方互发包进行健康校验等实现监控,而阿里云ECS服务器无法ping通主机ip,导致出错
公司表,部门表配置好后,用户保存即可成功
接下来完成权限管理功能
页面更新:2024-05-12
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号