SpringBoot学习(五)RSocket和Security
- request/response:请求/响应,发出一个请求,获取一个响应
- request/stream:请求/流式响应,一个请求对应多个/无数个流式的响应
- fire-and-forget:异步触发,不需要响应
- channel (bi-directional streams):双向异步通讯,也就是channel的支持
Spring Boot允许从WebFlux服务器通过WebSocket暴露RSocket,或者支持独立的RSocket服务器。这取决于应用程序的类型及其配置。
对于WebFlux应用程序(即类型为WebApplicationType.REACTIVE), RSocket服务器只有在下列属性匹配时才会被插入到Web服务器:
spring.rsocket.server.mapping-path=/rsocket # a mapping path is defined
spring.rsocket.server.transport=websocket # websocket is chosen as a transport
#spring.rsocket.server.port= # no port is defined
注:只有Reactor Netty才支持将RSocket插入web服务器,因为RSocket本身就是用这个库构建的。
或者,将RSocket TCP或websocket服务器作为独立的嵌入式服务器启动。除了依赖需求,唯一需要的配置是为该服务器定义一个端口:
spring.rsocket.server.port=9898 # the only required configuration
spring.rsocket.server.transport=tcp # you're free to configure other properties
1.3Spring消息传递RSocket支持
Spring Boot将自动为RSocket配置Spring消息传递基础结构。
这意味着Spring Boot将创建一个RSocketMessageHandler bean,用于处理应用程序的RSocket请求。
1.4使用RSocketRequester调用RSocket服务
一旦服务器和客户机之间建立了RSocket通道,任何一方都可以向另一方发送或接收请求。
作为服务器,可以在RSocket @Controller的任何处理程序方法上注入RSocketRequester实例。作为客户端,首先需要配置和建立RSocket连接。Spring Boot自动配置一个RSocketRequester。使用预期的编解码器构建此类情况。
RSocketRequester.Builder实例是一个原型bean,这意味着每个注入点都将为您提供一个新实例。这样做是有目的的,因为这个构建器是有状态的,您不应该使用同一个实例创建具有不同设置的请求程序。
下面的代码展示了一个典型的例子:
@Service
public class MyService { private final RSocketRequester rsocketRequester; public MyService(RSocketRequester.Builder rsocketRequesterBuilder) {
this.rsocketRequester = rsocketRequesterBuilder
.connectTcp("example.org", 9898).block();
} public Mono<User> someRSocketCall(String name) {
return this.requester.route("user").data(name)
.retrieveMono(User.class);
} }
二、安全
如果类路径上有Spring Security,那么默认情况下web应用程序是安全的。Spring Boot依赖于Spring Security的内容协商策略来决定是使用httpBasic还是formLogin。要将方法级安全性添加到web应用程序,您还可以使用所需的设置添加@EnableGlobalMethodSecurity。其他信息可以在Spring安全参考指南中找到。
默认的UserDetailsService只有一个用户。用户名是user,密码是随机的,在应用程序启动时在INFO级别打印,如下例所示:
Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
注:如果对日志配置进行了微调,请确保org.springframe .boot.autoconfigure.security类别设置为INFO级别消息。否则,将不打印默认密码。
您可以通过提供spring.security.user.name和spring.security.user.password来更改用户名和密码。
默认情况下,web应用程序的基本特性如下:
a.一个UserDetailsService(或WebFlux应用程序中的ReactiveUserDetailsService) bean,它具有内存存储和一个用户生成的密码(参见用户属性SecurityProperties.User)。
b.整个应用程序的基于表单的登录或HTTP基本安全(取决于请求中的Accept标头)(包括执行器端点,如果执行器位于类路径上)。
c.用于发布身份验证事件的DefaultAuthenticationEventPublisher。
1.MVC安全
默认的安全配置是在SecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现的。SecurityAutoConfiguration为web安全和UserDetailsServiceAutoConfiguration配置身份验证,这也与非web应用程序相关。要完全关闭默认的web应用程序安全配置,或组合多个Spring安全组件(如OAuth 2客户端和资源服务器),请添加WebSecurityConfigurerAdapter类型的bean(这样做不会禁用UserDetailsService配置或执行器的安全性)。
要关闭UserDetailsService配置,您可以添加UserDetailsService、AuthenticationProvider或AuthenticationManager类型的bean。
可以通过添加自定义的WebSecurityConfigurerAdapter来覆盖访问规则。Spring Boot提供了方便的方法,可用于覆盖执行器端点和静态资源的访问规则。EndpointRequest可以用来创建一个基于management.endpoints.web的请求匹配程序。基本路径属性。可以使用PathRequest为常用位置的资源创建一个RequestMatcher。
2.WebFlux安全
与Spring MVC应用程序类似,您可以通过添加Spring -boot-starter-security依赖项来保护WebFlux应用程序。默认的安全配置是在ReactiveSecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现的。ReactiveSecurityAutoConfiguration为web安全和UserDetailsServiceAutoConfiguration配置身份验证,这也与非web应用程序相关。要完全关闭默认的web应用程序安全配置,可以添加WebFilterChainProxy类型的bean(这样做不会禁用UserDetailsService配置或执行器的安全性)。
要关闭UserDetailsService配置,您可以添加类型为ReactiveUserDetailsService或ReactiveAuthenticationManager的bean。
通过添加一个定制的SecurityWebFilterChain bean,可以配置访问规则和使用多个Spring安全组件,如OAuth 2客户端和资源服务器。Spring Boot提供了方便的方法,可用于覆盖执行器端点和静态资源的访问规则。
EndpointRequest可以用来创建一个基于management.endpoints.web的management.endpoints.web.base-path属性。
可以使用PathRequest为常用位置的资源创建一个ServerWebExchangeMatcher。
例如,您可以通过添加以下内容来定制您的安全配置:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.pathMatchers("/foo", "/bar")
.authenticated().and()
.formLogin().and()
.build();
}
3.OAuth2
OAuth2是Spring支持的一个广泛使用的授权框架。
3.1客户端
如果您的类路径上有spring-security-oauth2-client,那么您可以利用一些自动配置来轻松设置OAuth2/Open ID连接客户机。这个配置使用了OAuth2ClientProperties下的属性。相同的属性适用于servlet和反应性应用程序。
您可以注册多个OAuth2客户机和在spring.security.oauth2.client前缀下的提供者。客户端前缀,如下例所示:
spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=https://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://my-auth-server/userinfo
spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=https://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
对于支持OpenID连接发现的OpenID连接提供程序,配置可以进一步简化。提供者需要配置一个发布方URI,该URI是其声明的发布方标识符。例如,如果提供的发布方uri是“https://example.com”,那么将向“https://example.com/.known/openid - Configuration”发出一个OpenID提供者配置请求。预期结果是一个OpenID提供者配置响应。下面的示例展示了如何使用发布方uri配置OpenID连接提供程序:
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
默认情况下,Spring Security的OAuth2LoginAuthenticationFilter只处理匹配/login/oauth2/code/*的url。如果希望自定义redirect-uri以使用不同的模式,则需要提供配置来处理该自定义模式。例如,对于servlet应用程序,您可以添加自己的WebSecurityConfigurerAdapter,如下所示:
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter { @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.redirectionEndpoint()
.baseUri("/custom-callback");
}
}
普通提供者的OAuth2客户端注册
对于常见的OAuth2和OpenID提供者,包括谷歌、Github、Facebook和Okta,我们提供了一组提供者缺省值(分别为谷歌、Github、Facebook和Okta)。
如果不需要自定义这些提供程序,则可以将提供程序属性设置为需要推断默认值的属性。另外,如果客户端注册的密钥与默认的受支持的提供者匹配,Spring Boot也会推断出这一点。
换句话说,下面示例中的两个配置使用了谷歌提供程序:
spring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
3.2资源服务器
如果您的类路径上有Spring -security- OAuth2 - Resource - Server, Spring Boot可以设置一个OAuth2资源服务器。对于JWT配置,需要指定JWK Set URI或OIDC发布方URI,如下例所示:
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
注:如果授权服务器不支持JWK设置的URI,您可以使用用于验证JWT签名的公钥来配置资源服务器。这可以使用spring.security.oauth2.resourceserver.jwt来完成。公钥位置属性,其中的值需要指向一个文件,该文件包含peme编码的x509格式的公钥。
相同的属性适用于servlet和反应性应用程序。
或者,您可以为servlet应用程序定义自己的JwtDecoder bean,或者为反应性应用程序定义ReactiveJwtDecoder。
在使用不透明令牌而不是JWTs的情况下,您可以配置以下属性来通过自省验证令牌:
spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret
同样,servlet和反应性应用程序都适用相同的属性。
或者,您可以为servlet应用程序定义自己的opaquetokenintrotor bean,或者为反应性应用程序定义一个reactiveopaquetokenintrotor。
3.3授权服务器
目前,Spring Security不支持实现OAuth 2.0授权服务器。但是,这个功能可以从Spring Security OAuth项目获得,Spring Security最终将完全取代它。在此之前,您可以使用spring-security- oau2 -autoconfigure模块轻松设置OAuth 2.0授权服务器;有关说明,请参阅其文档。
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party1.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.verification.credentials[0].certificate-location=path-to-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.entity-id=remote-idp-entity-id1
spring.security.saml2.relyingparty.registration.my-relying-party1.identityprovider.sso-url=https://remoteidp1.sso.url spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].private-key-location=path-to-private-key
spring.security.saml2.relyingparty.registration.my-relying-party2.signing.credentials[0].certificate-location=path-to-certificate
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.verification.credentials[0].certificate-location=path-to-other-verification-cert
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.entity-id=remote-idp-entity-id2
spring.security.saml2.relyingparty.registration.my-relying-party2.identityprovider.sso-url=https://remoteidp2.sso.url
5.致动器安全
出于安全考虑,除/health和/info之外的所有执行器默认都是禁用的。management.endpoints.web.exposure。include属性可用于启用执行器。
SpringBoot学习(五)RSocket和Security的更多相关文章
- SpringBoot学习(五)-->SpringBoot的核心
SpringBoot的核心 1.入口类和@SpringBootApplication Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的J ...
- springboot学习之授权Spring Security
SpringSecurity核心功能:认证.授权.攻击防护(防止伪造身份) 涉及的依赖如下: <dependency> <groupId>org.springframework ...
- springboot学习五:IDEA外部tomcat发布
pom.xml配置 屏蔽自带tomcat <dependency> <groupId>org.springframework.boot</groupId> < ...
- SpringBoot学习笔记(2):引入Spring Security
SpringBoot学习笔记(2):用Spring Security来保护你的应用 快速开始 本指南将引导您完成使用受Spring Security保护的资源创建简单Web应用程序的过程. 参考资料: ...
- spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid
SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...
- Springboot学习笔记(六)-配置化注入
前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...
- 尚硅谷springboot学习14-自动配置原理
配置文件能配置哪些属性 配置文件能配置的属性参照 自动配置的原理 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Ena ...
- SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用
SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用 Spring Boot Admin是一个管理和监控Spring Boot应用程序的应用程序.本文参考文档: 官 ...
- SpringBoot学习笔记(3):静态资源处理
SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...
- SpringBoot学习笔记(4):添加自定义的过滤器
SpringBoot:学习笔记(4)——添加自定义的过滤器 引入自定义过滤器 SpringBoot提供的前端控制器无法满足我们产品的需求时,我们需要添加自定义的过滤器. SpringBoot添加过滤器 ...
随机推荐
- RDA的使用和说明
一.RDA 说明 RDA(RemoteDiagnostic Agent)是oracle用来收集.分析数据库的工具,运行该工具不会改变系统的任何参数,RDA收集的相关数据非常全面,可以简化我们日常监控. ...
- redis源码分析(六)--cluster集群同步
Redis集群消息 作为支持集群模式的缓存系统,Redis集群中的各个节点需要定期地进行通信,以维持各个节点关于其它节点信息的实时性与一致性.如前一篇文章介绍的,Redis在专用的端口监听集群其它节点 ...
- Rust 智能指针(二)
1. Rc<T> 引用计数指针 Rc<T> 是引用计数指针,可以使用clone使得指针所指向的数据具有多个所有者. enum List { Cons(i32, Rc<Li ...
- Dubbo使用javassist生成动态类
在服务(本地和远程)暴露的时候会调用proxyFactory.getInvoker方法 具体位置: 本地暴露:ServiceConfig#exportLocal line:538 远程暴露: Serv ...
- 「UR#5」怎样跑得更快
「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...
- java之mybatis之查询及分页
1.mybatis中查询方式有3种 //查询单个值 @Test public void testFindOne()throws IOException{ SqlSession session = My ...
- modbus协议使用小记
下载了libmodbus库,交叉编译后运行,总是接收回复时不正确.原因不明. 由于使用到modbus的需求比较简单,所以选择直接拼出modbus的请求报文,然后用串口直接发送和接收的方式, 拼modb ...
- IEnumerable,ICollection,IList,List的使用
做C#的都知道:一类只能有一个继承类,但可以实现多个接口.这句话就告诉我们:IEnumerable,ICollection,IList,List区别了 首先我看看 IEnumerable: // ...
- permission 权限清单
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permiss ...
- CI隐藏入口文件index.php
1.需要apache打开rewrite_module,然后修改httpd.conf的AllowOverride none 为AllowOverride All(里面,不同的环境目录不同) 2.在CI的 ...