本文共 2166 字,大约阅读时间需要 7 分钟。
Oauth2
oauth2是一个搞授权的,对于Api网关来说,用oauth2来做业务鉴权是比较合适的选择,其有几种角色的定义:
资源拥有者(resource owner):能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户;资源服务器(resource server):存储受保护资源,客户端通过access token请求资源,资源服务器响应受保护资源给客户端;授权服务器(authorization server):成功验证资源拥有者并获取授权之后,授权服务器颁发授权令牌(Access Token)给客户端。客户端(client):第三方应用,也可以是它自己的官方应用;其本身不存储资源,而是资源拥有者授权通过后,使用它的授权(授权令牌)访问受保护资源,然后客户端把相应的数据展示出来/提交到服务器。oauth2原理图
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消耗。
sso连接zuul
security:user:password: 123456oauth2:sso:login-path: /loginclient:client-id: owenclient-secret: owen user-authorization-uri: ##网关地址负载认证中心服务access-token-uri: ##网关地址负载认证中心服务resource: token-info-uri: ##网关地址负载认证中心服务prefer-token-info: true为实现以上部分 必须注入RandomValueAuthorizationCodeServices持久化授权码,oauth2有jdbc相关实现,可以参考JdbcAuthorizationCodeServices改成redis方法 提高性能 。
开源项目:
联系作者qq:624191343 1758783856转载于:https://blog.51cto.com/13005375/2068205