当前位置: 首页 > news >正文

广东建设信息网行业服务版官网广州seo网站多少钱

广东建设信息网行业服务版官网,广州seo网站多少钱,wordpress修改注册页面,中国建造师网官网个人入口目录 一、需要了解的事项二、依赖三、WebSocket 配置3.1 、简单的消息代理3.2 、Spring安全配置 一、需要了解的事项 http和WebSocket的安全链和安全配置是完全独立的。SpringAuthenticationProvider根本不参与 Websocket 身份验证。将要给出的示例中,身份验证不会…

目录

  • 一、需要了解的事项
  • 二、依赖
  • 三、WebSocket 配置
    • 3.1 、简单的消息代理
    • 3.2 、Spring安全配置

一、需要了解的事项

  • http和WebSocket的安全链和安全配置是完全独立的。
  • SpringAuthenticationProvider根本不参与 Websocket 身份验证。
  • 将要给出的示例中,身份验证不会发生在 HTTP 协商端点上,因为 JavaScript STOMP(websocket)库不会随 HTTP 请求一起发送必要的身份验证标头。
  • 一旦在 CONNECT 请求上设置,用户( simpUser) 将被存储在 websocket 会话中,并且以后的消息将不再需要进行身份验证。

二、依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-messaging</artifactId>
</dependency>

三、WebSocket 配置

3.1 、简单的消息代理

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(final MessageBrokerRegistry config) {config.enableSimpleBroker("/queue/topic");config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(final StompEndpointRegistry registry) {registry.addEndpoint("stomp"); setAllowedOrigins("*")}
}

3.2 、Spring安全配置

由于 Stomp 协议依赖于第一个 HTTP 请求,因此需要授权对 stomp 握手端点的 HTTP 调用。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(final HttpSecurity http) throws Exceptionhttp.httpBasic().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers("/stomp").permitAll().anyRequest().denyAll();}
}

然后创建一个负责验证用户身份的服务。

@Component
public class WebSocketAuthenticatorService {public UsernamePasswordAuthenticationToken getAuthenticatedOrFail(final String  username, final String password) throws AuthenticationException {if (username == null || username.trim().isEmpty()) {throw new AuthenticationCredentialsNotFoundException("Username was null or empty.");}if (password == null || password.trim().isEmpty()) {throw new AuthenticationCredentialsNotFoundException("Password was null or empty.");}if (fetchUserFromDb(username, password) == null) {throw new BadCredentialsException("Bad credentials for user " + username);}return new UsernamePasswordAuthenticationToken(username,null,Collections.singleton((GrantedAuthority) () -> "USER") // 必须给至少一个角色);}
}

接着需要创建一个拦截器,它将设置“simpUser”标头或在 CONNECT 消息上抛出“AuthenticationException”。

@Component
public class AuthChannelInterceptorAdapter extends ChannelInterceptor {private static final String USERNAME_HEADER = "login";private static final String PASSWORD_HEADER = "passcode";private final WebSocketAuthenticatorService webSocketAuthenticatorService;@Injectpublic AuthChannelInterceptorAdapter(final WebSocketAuthenticatorService webSocketAuthenticatorService) {this.webSocketAuthenticatorService = webSocketAuthenticatorService;}@Overridepublic Message<?> preSend(final Message<?> message, final MessageChannel channel) throws AuthenticationException {final StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);if (StompCommand.CONNECT == accessor.getCommand()) {final String username = accessor.getFirstNativeHeader(USERNAME_HEADER);final String password = accessor.getFirstNativeHeader(PASSWORD_HEADER);final UsernamePasswordAuthenticationToken user = webSocketAuthenticatorService.getAuthenticatedOrFail(username, password);accessor.setUser(user);}return message;}
}

请注意:preSend() 必须返回 UsernamePasswordAuthenticationToken,Spring 安全链中会对此进行测试。如果UsernamePasswordAuthenticationToken构建没有通过GrantedAuthority,则身份验证将失败,因为没有授予权限的构造函数自动设置authenticated = false 这是一个重要的细节,在 spring-security 中没有记录。

最后再创建两个类来分别处理授权和身份验证。

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE + 99)
public class WebSocketAuthenticationSecurityConfig extends  WebSocketMessageBrokerConfigurer {@Injectprivate AuthChannelInterceptorAdapter authChannelInterceptorAdapter;@Overridepublic void registerStompEndpoints(final StompEndpointRegistry registry) {// 这里不用给任何东西}@Overridepublic void configureClientInboundChannel(final ChannelRegistration registration) {registration.setInterceptors(authChannelInterceptorAdapter);}}

请注意:这@Order是至关重要的,它允许我们的拦截器首先在安全链中注册。

@Configuration
public class WebSocketAuthorizationSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {@Overrideprotected void configureInbound(final MessageSecurityMetadataSourceRegistry messages) {// 添加自己的映射messages.anyMessage().authenticated();}// 这里请自己按需求修改@Overrideprotected boolean sameOriginDisabled() {return true;}
}

之后编写客户端进行连接,我们就可以这样指定客户端进行消息的发送。

    @MessageMapping("/greeting")public void greetingReturn(@Payload Object ojd){simpMessagingTemplate.convertAndSendToUser(username,"/topic/greeting",ojd);}
http://www.ds6.com.cn/news/37532.html

相关文章:

  • 做360全景的网站做百度推广销售怎么找客户
  • 知乎做笔记的网站百度站长平台网站收录
  • wordpress 搜索mysql排名sem优化软件
  • 做58推广网站找哪家好视频互联网推广选择隐迅推
  • 辛集网站建设牛奶推广软文文章
  • 网站建设分站要备案优化什么意思
  • 合肥网站建设工作室郑州千锋教育培训机构怎么样
  • 做按摩网站优化外贸网站建设设计方案
  • 静态网站 动态网站seo百度推广
  • 网站开发可以学吗如何把网站推广出去
  • 上海建站网络科技黄山搜索引擎优化
  • 山东网站建设公司国内b2b十大平台排名
  • 广州工商注册流程郑州seo线下培训
  • 网站建设企长沙网络公司最新消息
  • 营销型网站建设原则智能建站模板
  • 免费做兼职的网站有吗合肥网站seo费用
  • 桂林网站制作多少钱b站推广渠道
  • 公网ip做网站怎么做平台推广
  • 网站标题seo2021小说排行榜百度风云榜
  • 珠海婚恋网站建设市场分析大批量刷关键词排名软件
  • 仿业务网站源码网络培训课程
  • 高端网站开发程线上营销手段有哪些
  • 个人网站作品下载排名优化课程
  • 蚌埠网站制作公司新媒体运营需要哪些技能
  • 萧山网站建设那家好最近大事件新闻
  • 找人做网站需要问哪些问题外国黄冈网站推广平台
  • 镇江网站建设一般多少钱杭州网站搜索排名
  • 网站建设项目的实训报告免费发布推广信息网站
  • 网校网站怎么做创建网站花钱吗
  • jquery 炫酷网站长春疫情最新消息