一、SpringCloud Security简介
          Spring Cloud Security提供了一组原语,用于构建安全的应用程序和服务,而且操作简便。可以在外部(或集中)进行大量配置的声明性模型有助于实现大型协作的远程组件系统,通常具有中央身份管理服务。它也非常易于在Cloud Foundry等服务平台中使用。在Spring Boot和Spring Security OAuth2的基础上,可以快速创建实现常见模式的系统,如单点登录,令牌中继和令牌交换。愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三

功能:

从Zuul代理中的前端到后端服务中继SSO令牌
资源服务器之间的中继令牌
使Feign客户端表现得像OAuth2RestTemplate(获取令牌等)的拦截器
在Zuul代理中配置下游身份验证

二、SpringCloud Security知识点

封装顺序是这样的:spring security及其各个模块=》spring cloud security=》spring boot autoconfigure的security部分,比如autoconfigure模块有个spring security的sso,是对spring security在oath2下的封装

spring oauth2 authorizeserver,resourceserver,认证服务器和资源服务器是怎么交互的,token_key,/oauth/token/ refresh/token

resourceserver就是业务系统,oauth client 就是边缘业务系统,比如直接面向用户的UI系统,或者UI系统直接调用的API接口这一层;

JWT和OAuth2的区别?看到好多人在比较这两个东西,现在终结这个问题:JWT只是OAuth2中的token的一种类型。

jwt client(Resource Server或者Zuul等),使用jwt的业务系统在解码acces_token的时候,需要一个toke_key,这个token-key就是JWT Client应用启动的时候从Auth Server拉取的,接口是token/token_key

单点登录这种功能,好多javaee容器都自带的,像websphere
spring Security完全将认证和授权分开了,资源只需要声明自己是需要认证的,需要什么样的权限,只管跟当前用户要access_token。

授权的四种方式任意,只要拿到token就可以去让资源去认证。

边缘服务器需要开启@EnableOAuth2Sso,但是边缘服务器也是一个ResourceServer,边缘服务器如果是zuul的话,就不是一个ResourceServer了,只需要添加@EnableOAuth2Sso注解就可以了;

client_credentials模式下spring boot不会帮助spring Security构建ClientCredentialsResourceDetails 对象,需要开发者自己创建

favicon.icon,记得把这个东西过滤掉,奶奶的

在其中一个边缘服务上,您可能需要启用单点登录。

@EnableOAuthSso,只需要在边缘服务器指定没用来引导未登录的用户登录系统。@EnableOAuthSso将允许您将未经认证的用户的自动重定向转向授权服务器,他们将能够登录
EnableOAuth2Client,在中间中继的时候用
ClientCredentialsTokenEndpointFilter,AS设置了allowFormAuthenticationForClients才会有,详情看这里面的AuthorizationServerSecurityConfigurer#configure(HttpSecurity http)逻辑,这点非常重要,ClientCredentialsTokenEndpointFilter是用来验证clientid和client_secret的,使用clientid和client_secret换取下一步的东西;

TokenGranter,AuthorizationCodeTokenGranter,ClientCredentialsTokenGranter,RefreshTokenGranter,ImplicitTokenGranter,ResourceOwnerPasswordTokenGranter

TokenServices分为两类,一个是用在AuthenticationServer端,AuthorizationServerTokenServices,ResourceServer端有自己的tokenServices接口,

BearerTokenExtractor,从其可以看出,token的获取顺序,Header,parameters(get/post)

spring security 保护自己的配置,作为ResourceServer的权限配置和作为AuthorizationServer的配置都是在不同的地方

An OAuth 2 authentication token can contain two authentications: one for the client(OAuth2 Client) and one for the user. Since some OAuth authorization grants don’t require user authentication, the user authentication may be null.

jwt是不需要存储access_toen的,jwt的机制就是将所有的信息都存在了token里面,从JwtTokenStore也可以看出来

OAuth2AuthenticationManager是密切与token认证相关的,而不是与获取token密切相关的。这是真正认证的地方,一会重点debug,resourceIds

每一个ResourceServer在配置的时候,

ResourceServerConfiguration,需要配置一个resourceID,一个ResourceServer只能配置一个

oauth/token = 先验证的是clientid和clientsecret,接着在验证username和userpassword,都是用的ProvideManager,两次验证是两个不同的请求,oauth2客户端会使用RestTemplate请求服务器的接口

ClientCredentialsTokenEndpointFilter用来验证clientId和clientsecret的:

OAuth2ClientAuthenticationProcessingFilter:OAuth2客户端用来从OAuth2认证服务器获取access token,也可以从OAuth2认证服务器加载authentication对象到OAuth2客户端的SecurityContext对象中;里面调用OAuth2AuthenticationManager#authenticate()方法使用DefaultTokenServices ,DefaultTokenServices 使用JwtTokenStore,JwtTokenStore使用JwtAccessTokenConverter来将JWT解密成Auth对象。 来从AuthServer请求授权信息
accessToken被解密成如下的JWT对象:

{“alg”:”RS256”,”typ”:”JWT”} {“exp”:1503758022,”user_name”:”admin”,”authorities”:[“ROLE_TRUSTED_CLIENT”,”ROLE_ADMIN”,”ROLE_USER”],”jti”:”d56f43d2-6c4a-46cf-85f3-050ee195a2bd”,”client_id”:”confidential”,”scope”:[“read”]} [128 crypto bytes]

AbstractSecurityInterceptor#befroeInvaction 是ResourceServer获取认证信息的地方

只要是需要验证token有效性的都需要jwt.key-uri的配置

AffirmativeBased值得debug
 
TIPS

@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/favicon.ico");}@Bean@Overrideprotected UserDetailsService userDetailsService(){InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("user").password("password").roles("USER").authorities("USER").build());manager.createUser(User.withUsername("admin").password("password").roles("USER", "ADMIN", "TRUSTED_CLIENT").authorities("USER").build());return manager;}

这两种方式有差别,牵扯到UsernamePasswordAuthenticationFilter和ClientCredentialsTokenEndpointFilter


security: oauth2:client:client-id: confidentialclient-secret: secretaccess-token-uri: http://localhost:8080/oauth/tokenuser-authorization-uri: http://localhost:8080/oauth/authorizeuse-current-uri: trueresource: jwt:key-uri: http://localhost:8080/oauth/token_keyfilter-order: 3  

client里面的配置最终是用来生成OAuth2ProtectedResourceDetails的bean的,参看OAuth2ProtectedResourceDetailsConfiguration

整体代码结构如下:资料和源码来源 

java B2B2C springmvc mybatis电子商务平台源码-Spring Cloud Security相关推荐

  1. java B2B2C springmvc mybatis电子商务平台源码-Consul服务发现原理...

    Consul 是什么 Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License ...

  2. java B2B2C springmvc mybatis电子商务平台源码

    用java实施的电子商务平台太少了,使用spring cloud技术构建的b2b2c电子商务平台更少,大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B ...

  3. java B2B2C springmvc mybatis电子商务平台源码-服务的注册与发现(Eureka)

    1.介绍 对于微服务的治理而言,其核心就是服务的注册和发现.在SpringCloud 中提供了多种服务注册与发现组件:Eureka,Consul,Zookeeper.官方推荐使用Eureka. 需要J ...

  4. java B2B2C springmvc mybatis电子商务平台源码-消息队列之RocketMQ

    RocketMQ出自阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进,消息可靠性上比 Kafka 更好.RocketMQ在阿里集团被广泛应用在订单,交易, ...

  5. java B2B2C springmvc mybatis电子商务平台源码-------zuul网关实现

    一.简介 在Springcloud中用zuul来实现网关功能,客户端的请求首先经过负载均衡Ngnix,再到达服务网关(zuul集群),然后再到具体的服务.Zuul的主要功能是路由转发和过滤器.路由功能 ...

  6. java计算机毕业设计中药材电子商务平台源码+mysql数据库+系统+部署+lw文档

    java计算机毕业设计中药材电子商务平台源码+mysql数据库+系统+部署+lw文档 java计算机毕业设计中药材电子商务平台源码+mysql数据库+系统+部署+lw文档 本源码技术栈: 项目架构:B ...

  7. 电子商务商城源码 Spring Cloud、Spring Boot、Mybatis、Redis

    1. 涉及平台 Spring Cloud.Spring Boot.Mybatis.Redis 2. 核心架构 Spring Cloud.Spring Boot.Mybatis.Redis 3. 前端框 ...

  8. java B2B2C Springcloud电子商务平台源码-security简单使用

    security的简单原理: 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码:壹零叁八柒柒肆六二六 使用众多的拦截器对url拦截,以此来管理权限.但是这么 ...

  9. java B2B2C Springboot电子商务平台源码-Feign 基本使用

    1. [microcloud-consumer-feign]为了可以使用到 feign 支持,需要修改 pom.xml 配置文件,引入相关依赖包:需要JAVA Spring Cloud大型企业分布式微 ...

最新文章

  1. 智销功能_Shiro权限框架
  2. java语言仅支持单重继承_java语言程序设计基础篇习题_复习题_第十一章
  3. 将DataFrame数据如何写入到Hive表中
  4. LeetCode 1418. 点菜展示表(哈希map)
  5. 7年专科生程序员同时去腾讯和微软面试,问HR结果以为听错了,结局反转!!
  6. 数据结构与算法分析(八)——BFS算法
  7. Javascript预解析、代码执行
  8. AirServer for Mac(ios投屏到mac的实用工具)
  9. Apache Lucene 3.x推荐教程
  10. 【懒人版】labview 软件加密+试用期限制+绑定硬件
  11. inssider序列号_AP注册问题-华三.ppt
  12. terser作为js代码压缩工具
  13. MapBox本地化部署
  14. 组态王报警历史存MySQL_组态王6.55报警存储与历史数据查询设置全过程
  15. Python美股量化交易填坑记录——13c.Vegas隧道交易机器人(实盘记录)
  16. JS基础知识必看篇(黄梦岚)
  17. 有意思的java工具——Retroweaver和ProGuard
  18. android恢复出厂设置流程分析
  19. oracle ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接
  20. GDAL创建带有空间参考坐标系的shp矢量文件遇到的问题与解决方法

热门文章

  1. 常考数据结构与算法:进制转换
  2. 常考数据结构与算法:容器盛水问题
  3. python六十二: 析构方法
  4. 几篇JVM实战的东西
  5. iOS_“图片浏览选择”功能的编写思路
  6. Redis、Memcache和MongoDB的区别
  7. Linux文本三剑客之sed仗剑走天涯
  8. FreeSWITCH与PSTN对接
  9. Dijkstra 算法
  10. java读取json数据并解析输出对象