powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
15 сообщений из 15, страница 1 из 1
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39772997
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юзал этот гайд .

Но вот столкнулся с тем что мне нужно получить юзера в контроллере. А получить его я могу из JWT токена. Если с REST приложением и JWT все понятно и сделано, то в сокетах я не понимаю как мне авторизовывать пользователя?

Код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    private final TokenUtils tokenUtils;

    private static final String ENDPOINT = "/websocket";

    private static final String TOPIC_CHAT = "/secured/client";
    private static final String TOPIC_QUEUE = "/secured/queue";
    private static final String TOPIC_OPERATOR = "/secured/operator";

    public WebSocketConfig(TokenUtils tokenUtils) {
        this.tokenUtils = tokenUtils;
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker(TOPIC_CHAT, TOPIC_QUEUE, TOPIC_OPERATOR);
        config.setApplicationDestinationPrefixes("/ws");
        config.setUserDestinationPrefix("/secured/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint(ENDPOINT)
                .setAllowedOrigins("*")
                .addInterceptors(new WebSocketHandshakeInterceptor()).withSockJS();
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {

            @Override
            public Message<?> preSend(Message<?> message,  MessageChannel channel) {

                StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);

                List<String> tokenList = accessor.getNativeHeader("Authorization");
                String token = null;

                if(tokenList == null || tokenList.size() < 1) {
                    return message;
                } else {
                    token = tokenList.get(0);
                    if(token == null) {
                        return message;
                    }
                }

                accessor.setUser(null);

                // not documented anywhere but necessary otherwise NPE in StompSubProtocolHandler!
                accessor.setLeaveMutable(true);
                return MessageBuilder.createMessage(message.getPayload(), accessor.getMessageHeaders());
            }

        });
    }

}



Конфиг секюрити для сокетов:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

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

    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.simpTypeMatchers(
                SimpMessageType.CONNECT,
                SimpMessageType.DISCONNECT).permitAll().anyMessage().permitAll()
                .simpDestMatchers("/secured/**").authenticated().anyMessage().authenticated();
    }
}



SecurityConfig

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UnauthorizedEntryPoint unauthorizedEntryPoint;

    @Autowired
    private TokenAuthenticationProvider tokenAuthenticationProvider;

    private static final RequestMatcher PUBLIC_URLS = new OrRequestMatcher(
            new AntPathRequestMatcher("/"),
            new AntPathRequestMatcher("/index"),
            new AntPathRequestMatcher("/index.html"),
            new AntPathRequestMatcher("/resource/**"),
            new AntPathRequestMatcher("/favicon.ico"),
            new AntPathRequestMatcher("/actuator/**"),
            new AntPathRequestMatcher("/h2-console/**"),
            new AntPathRequestMatcher("/**/favicon.ico"),
            new AntPathRequestMatcher("/webjars/**"),
            new AntPathRequestMatcher("/websocket/**"),
            new AntPathRequestMatcher("/api/v1/download/**"),
            new AntPathRequestMatcher("/api/v1/owner/auth/**"),
            new AntPathRequestMatcher("/api/v1/operator/auth/**")
    );

    private static final RequestMatcher PROTECTED_URLS = new NegatedRequestMatcher(PUBLIC_URLS);

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(this.tokenAuthenticationProvider);
    }

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().requestMatchers(PUBLIC_URLS);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.cors().and()
                .csrf().disable()
                .formLogin().disable()
                .httpBasic().disable()
                .logout().disable();

        http.headers().frameOptions().disable();

        http.authorizeRequests()
                .requestMatchers(PUBLIC_URLS)
                .permitAll();

        http.authorizeRequests()
                .antMatchers("/secured/**").authenticated();

        http
                .sessionManagement()
                .sessionCreationPolicy(STATELESS)
                .and()
                .exceptionHandling()
                .defaultAuthenticationEntryPointFor(unauthorizedEntryPoint, PROTECTED_URLS)
                .and()
                .authenticationProvider(tokenAuthenticationProvider)
                .addFilterBefore(tokenAuthenticationFilter(), AnonymousAuthenticationFilter.class)
                .authorizeRequests()
                .requestMatchers(PROTECTED_URLS)
                .authenticated();

    }

    @Bean
    TokenAuthenticationFilter tokenAuthenticationFilter() throws Exception {
        final TokenAuthenticationFilter filter = new TokenAuthenticationFilter(PROTECTED_URLS);
        filter.setAuthenticationManager(authenticationManager());
        filter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandler());
        filter.setAuthenticationFailureHandler(new AuthenticationFailureHandler());
        return filter;
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration configuration = new CorsConfiguration().applyPermitDefaultValues();
        configuration.addAllowedMethod(HttpMethod.PUT);
        configuration.addAllowedMethod(HttpMethod.DELETE);
        configuration.addAllowedMethod(HttpMethod.OPTIONS);
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773001
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,

а что ты от использования этого хочешь добиться?
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773008
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вроде тут и можно(из твоего кода). Единственное, что это надо делать только
Код: java
1.
if (StompCommand.CONNECT.equals(accessor.getCommand())) {} 

, если верить документации: https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#websocket-stomp-authentication

После чего, парсить юзака, записать его в текущую сессию, после чего оно там магически и автоматически ассоциирует сессию с пользователем....магия!


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
@Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {

            @Override
            public Message<?> preSend(Message<?> message,  MessageChannel channel) {

                StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);

                List<String> tokenList = accessor.getNativeHeader("Authorization");
                String token = null;

                if(tokenList == null || tokenList.size() < 1) {
                    return message;
                } else {
                    token = tokenList.get(0);
                    if(token == null) {
                        return message;
                    }
                }

                accessor.setUser(null);

                // not documented anywhere but necessary otherwise NPE in StompSubProtocolHandler!
                accessor.setLeaveMutable(true);
                return MessageBuilder.createMessage(message.getPayload(), accessor.getMessageHeaders());
            }

        });
    }
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773031
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяTsyklop, а что ты от использования этого хочешь добиться?
как ни странно получить авторизованного юзера
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773033
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopкак ни странно получить авторизованного юзерапочему этот гайд? разве нет ничего проще?
и я так понимаю
это
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  private static final RequestMatcher PUBLIC_URLS = new OrRequestMatcher(
            new AntPathRequestMatcher("/"),
            new AntPathRequestMatcher("/index"),
            new AntPathRequestMatcher("/index.html"),
            new AntPathRequestMatcher("/resource/**"),
            new AntPathRequestMatcher("/favicon.ico"),
            new AntPathRequestMatcher("/actuator/**"),
            new AntPathRequestMatcher("/h2-console/**"),
            new AntPathRequestMatcher("/**/favicon.ico"),
            new AntPathRequestMatcher("/webjars/**"),
            new AntPathRequestMatcher("/websocket/**"),
            new AntPathRequestMatcher("/api/v1/download/**"),
            new AntPathRequestMatcher("/api/v1/owner/auth/**"),
            new AntPathRequestMatcher("/api/v1/operator/auth/**")


ограничивает доступность?
для всех или можно указать что и для какого юзера?
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773034
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, это для реста. Открытые всем ресурсы.
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773037
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин, Хорошо. Понял. А вот такой момент. Я так понимаю что юзер ложится в сессию. а у этой сессии есть время жизни. Когда сессия заинвалидейтится то юзер тоже пропадет. и соответственно если будет сообщение где требуется юзер, а его не будет то будет ошибка?

Может стоит на каждое сообщение проверять юзверя? да, понимаю что будет зашквар если много запросов. но все же.
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773067
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773068
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин, это простой сокет. без sockjs. что я должен был там прочитать?
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773071
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklop,
сессия wsимеет бесконечный срок. сессия http по умолчанию 30 минут, но http сессию можно продлять
т.е. при каждом обращении от клиента по ws время жизни продляется на некоторое время.
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773073
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяTsyklop,
сессия wsимеет бесконечный срок. сессия http по умолчанию 30 минут, но http сессию можно продлять
т.е. при каждом обращении от клиента по ws время жизни продляется на некоторое время.
Тут нет того что было в обычном websocket api.
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773074
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, точнее тут идет работа выше того апи.
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773076
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tsyklopвадя, точнее тут идет работа выше того апи.да, но сам ws от этого не стал другим.
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773292
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
    #39773307
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopОзверинTsyklop, https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/html/websocket.html
Так что там?

там вся интересующая вас информация. А на ту, что не хватает - есть ссылка.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot 2 + Spring Security + JWT + WebSocket + SockJS + STOMP Проблема Авторизации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]