2017-12-04 7 views
-2

Es scheint kein sauberes und einfaches Beispiel für das Erstellen einer sicheren Websocket-Verbindung irgendwo auf den Interwebs zu geben, noch Anweisungen zum Einrichten eines ... irgendwelche Ideen?Wie machen Sie eine sichere Websocket-Verbindung mit Java auf der Client-Seite?

+0

Im Ernst, Sie können Google keine webSocket-Client-Bibliothek, die mit Java funktioniert? – jfriend00

+0

Wie ich schon sagte, ich kann kein sauberes Beispiel finden, mit Java wäre 9 optimal. Wenn Sie ein Beispiel sehen, das irgendwo funktioniert, lassen Sie es mich wissen ... – whatfield

Antwort

0

Ich würde einige Richtlinien für Websocket-Authentifizierung bereitstellen. Da Websocket von http aktualisiert wird, basiert die Authentifizierung auch auf http. Sie können die http-Verbindung mit ssl oder basic oder digest auth ausstatten.

Ich hatte mit Feder Websocketauth zuvor gearbeitet, ssl ist nur um http zu https zu aktualisieren. Ich würde hier Digest Auth für Federwebsocket posten.

1.Configure der Server Benutzer verdauen Auth, Frühling Sicherheit kann es bekommen:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    public final static String REALM="MY_REALM"; 

    @Autowired 
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN") 
     .and().withUser("test").password("test").roles("USER"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable() 
      .authorizeRequests() 
      .anyRequest().authenticated() 
      .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
      .and().exceptionHandling().authenticationEntryPoint(getDigestEntryPoint()) 
      .and().addFilter(getDigestAuthenticationFilter(getDigestEntryPoint())); 

    } 

    @Bean 
    public MyDigestAuthenticationEntryPoint getDigestEntryPoint() { 
     MyDigestAuthenticationEntryPoint digestAuthenticationEntryPoint = new MyDigestAuthenticationEntryPoint(); 
     digestAuthenticationEntryPoint.setKey("mykey"); 
     digestAuthenticationEntryPoint.setNonceValiditySeconds(120); 
     digestAuthenticationEntryPoint.setRealmName(REALM); 
     return digestAuthenticationEntryPoint; 
    } 

    public DigestAuthenticationFilter getDigestAuthenticationFilter( 
      MyDigestAuthenticationEntryPoint digestAuthenticationEntryPoint) throws Exception { 
     DigestAuthenticationFilter digestAuthenticationFilter = new DigestAuthenticationFilter(); 
     digestAuthenticationFilter.setAuthenticationEntryPoint(digestAuthenticationEntryPoint); 
     digestAuthenticationFilter.setUserDetailsService(userDetailsServiceBean()); 
     return digestAuthenticationFilter; 
    } 

    @Override 
    @Bean 
    public UserDetailsService userDetailsServiceBean() throws Exception { 
     return super.userDetailsServiceBean(); 
    } 
} 
public class MyDigestAuthenticationEntryPoint extends DigestAuthenticationEntryPoint { 

    @Override 
    public void afterPropertiesSet() throws Exception{ 
     super.afterPropertiesSet(); 
     setRealmName(WebSecurityConfig.REALM); 
    } 
} 

2.Extend von AbstractSecurityWebSocketMessageBrokerConfigurer:

@Configuration 
@EnableWebSocketMessageBroker 
public class WssBrokerConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { 

    @Override 
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { 
     messages 
      .nullDestMatcher().authenticated() 
      .simpSubscribeDestMatchers("/topic/notification").permitAll() 
      .simpDestMatchers("/**").authenticated() 
      .anyMessage().denyAll(); 
    } 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableSimpleBroker("/topic"); 
     config.setApplicationDestinationPrefixes("/ws"); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/hpdm-ws").setAllowedOrigins("*").withSockJS(); 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 
     MappingJackson2HttpMessageConverter converter = 
       new MappingJackson2HttpMessageConverter(mapper); 
     return converter; 
    } 

    @Override 
    protected boolean sameOriginDisabled() { 
     return true; 
    } 
} 

3.Digest Auth für Client auf dieses Thema hinweisen :

spring websocket with digest authentication

Verwandte Themen