Oauth2

oauth2是一个搞授权的,对于Api网关来说,用oauth2来做业务鉴权是比较合适的选择,其有几种角色的定义:
资源拥有者(resource owner):能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户;
资源服务器(resource server):存储受保护资源,客户端通过access token请求资源,资源服务器响应受保护资源给客户端;
授权服务器(authorization server):成功验证资源拥有者并获取授权之后,授权服务器颁发授权令牌(Access Token)给客户端。
客户端(client):第三方应用,也可以是它自己的官方应用;其本身不存储资源,而是资源拥有者授权通过后,使用它的授权(授权令牌)访问受保护资源,然后客户端把相应的数据展示出来/提交到服务器。

oauth2原理图
04.spring security oauth2认证中心 集成zuul网关的代码分析

zuul作为业务网关需要对其内部的服务进行权限控制,采用oauth2的资源服务器集成到zuul中可以很好的保护zuul内部的服务,需要搭建服务注册中心,认证中心,鉴权中心三大板块,其中鉴权中心是和zuul整合在一起充当门面设计,zuul判断哪些服务需要token哪些不需要。
服务注册中心:open-eureka-server,此项目为eureka-server服务器,eureka客户端通过服务名实现ribbon的负载均衡,具体。
认证中心:open-oauth-server,此项目结合了spring cloud oauth2的认证服务器功能,实现了派发token的作用,同时此认证中心纳入到了服务注册中心,实现高可用。

鉴权中心:open-api-gateway ,此项目为业务网关同时也是资源服务器,可以接入各种微服务子项目,通过配置AuthorizeConfigProvider实现具体鉴权或放权功能。

解决Principal must not be null的关键在于OAuth2AuthenticationManager类种的 tokenServices.loadAuthentication(token),认证中心以及鉴权中心需要同时实现一下接口
public class RedisTemplateTokenStore implements TokenStore {

private static final String ACCESS = "access:";
private static final String AUTH_TO_ACCESS = "auth_to_access:";
private static final String AUTH = "auth:";
private static final String REFRESH_AUTH = "refresh_auth:";
private static final String ACCESS_TO_REFRESH = "access_to_refresh:";
private static final String REFRESH = "refresh:";
private static final String REFRESH_TO_ACCESS = "refresh_to_access:";
private static final String CLIENT_ID_TO_ACCESS = "client_id_to_access:";
private static final String UNAME_TO_ACCESS = "uname_to_access:";

}即可解决Principal must not be null报错,此方式也是最具效率的方式,Principal must not be null报错是由于采用的RemoteTokenServices方式校验token,这种方式需要通过http连接认证中心,认证中心需要从redis种校验token,采取RedisTemplateTokenStore重写token方式可以直连redis避免额外的http消耗。

04.spring security oauth2认证中心 集成zuul网关的代码分析

sso连接zuul
security:
user:
password: 123456
oauth2:
sso:
login-path: /login
client:
client-id: owen
client-secret: owen
user-authorization-uri: http://127.0.0.1:9200/auth/oauth/authorize ##网关地址负载认证中心服务
access-token-uri: http://127.0.0.1:9200/auth/oauth/token ##网关地址负载认证中心服务
resource:
token-info-uri: http://127.0.0.1:9200/auth/oauth/check_token ##网关地址负载认证中心服务
prefer-token-info: true

为实现以上部分 必须注入RandomValueAuthorizationCodeServices持久化授权码,oauth2有jdbc相关实现,可以参考JdbcAuthorizationCodeServices改成redis方法 提高性能 。

开源项目:https://gitee.com/owenwangwen/open-capacity-platform
联系作者qq:624191343 1758783856