oauth2-client在Nginx代理后遇到的问题和解决方案

OAuth2 Client在实际运用过程中遇到的问题

服务程序集成了OAuth2-Client,以便于用户能够方便集成到支持OAuth2第三方登录的自有业务系统中。开发完成后,本地测试、或者直连服务程序,都没有问题。但凡放到线上环境,经过了nginx 转发后,我们的服务程序OAuth登录永远是以失败告终。

现象如下:

访问需要授权的接口时 https://blog.95id.com:4005/user_attr,期望是跳转到授权服务器 github.com进行登录授权,但实际都是跳转到``http://blog.95id.com/login`

因为当时直接用服务程序的端口没问题,就将解决思路放在了nginx 转发过程上。

当时线上环境路由规则类似于:

第一层:nginx1 4005 (ssl、负载均配置在这)

第二层:nginx2 4005

第三层:oauth2-client 8082

再看nginx 的配置,第一层nginx 配置:


SpringBoot集成Mongodb

SpringBoot集成Mongodb

1. SpringBoot集成

pom.xml

pom.xml
1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>${spring.boot.version}</version>
</dependency>

application.properties

application.properties
1
spring.data.mongodb.uri=mongodb://user:pwd@ip:27017/database

集群版mongodb

application.properties
1
spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database

2. 下划线转驼峰


基于RBAC的Rest抽象资源权限控制设计及实现

基于spring boot的一个小项目,前后端分离,采用REST风格的接口设计,在做权限设计时觉得以前的权限控制实现比较繁琐,一个Action就对应一条Permission。所以想着接口可以走REST风格,权限为什么不可以呢?比如称作READ风格的权限控制(Representational Authorization Design)……

REST早已不是新鲜事物,基于REST的权限控制网上也是有现成的,基于RESTful API 怎么设计用户权限控制?写得很棒,所以基于这篇文章的设计思路做了个实现(java)。本文的前半段,主要是引用文章阐述设计思路,后半部分主要为程序code实现。

其中后端自定义一个过滤器做权限过滤,用到了spring util包下的AntPathMatcher做权限规则匹配;前端也就一个directive就搞定了。技术上并没有引用什么技术框架,关键还是抽象思维且将设计思路转化为程序上code。

传统的权限配置 vs 权限被抽象成资源和状态

1
2
3
4
5
/getUsersGroups?id=1
/getUsersExpress
/getUsersLables?eventId=xxx
/createUsers?name=xxx&age=18
/updateEvent?id=xx

vs

1
2
3
GET /users/**  表示 对 users 资源 及events 附属的资源 有获取/浏览的权限
POST /users 表示 对 users 资源 有新增的权限
PUT /users/* 表示 对 users 有 修改的权限

spring boot 动态数据源配置 & 运行时新增数据源

spring boot 动态数据源配置 & 运行时新增数据源

场景:

  1. 同一系统支持不同业务场景,需要用到不同的数据库。
  2. 各个用户/应用之间数据完全隔离(不同的用户/应用,不同的数据库),而一个程序需要支持不同的用户/应用。例如 一些paas服务需要支持不同的业务场景,但是不同项目之间数据、账号、权限、token等业务数据都是完全隔离的,仅共享机器资源。

一、spring boot 动态数据源配置

方案:在一个确切的地方存储 数据源的配置信息(我是将这些信息存储在一个 配置数据库表中,而这个配置数据库是确切的,作为主数据源配置)。启动spring时,会初始化这个配置数据源,然后将其他动态数据源信息取出来初始化好datasource 注册到spring 容器。

原理:主要是实现AbstractRoutingDataSource的抽象类,然后将该类注册到spring容器,其中关键点是:

  1. 配置AbstractRoutingDataSource类的默认数据源Object defaultTargetDataSource 和其他数据源Map<Object, Object> targetDataSources。targetDataSources就是我们动态配置的数据源,key-value 接口,后面根据key 查找 datasource
  2. 实现determineCurrentLookupKey()方法,该方法决定了当前操作选择哪个数据源
  3. 注册到spring 容器

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×