用户登录Springboot / Security时,最大用户会话数不起作用

时间:2019-08-28 16:49:34

标签: java spring spring-boot spring-security

我正在尝试将最大会话数添加到我的spring安全上下文中,但是设置没有生效。我一直在遵循此代码以使用this tutorial在spring后端上实现JWT令牌。

我已经将我相信的相关代码添加到了安全配置中:


    @Bean
    public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
        JwtAuthenticationFilter filter = new JwtAuthenticationFilter();
        return filter;
    }

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider());
    }

        http
                .cors()
                    .and()
                .csrf()
                    .disable()
                .exceptionHandling()
                    .authenticationEntryPoint(unauthorizedHandler)
                    .and()
                .authorizeRequests()
                    .antMatchers("/",
                        "/favicon.ico",
                        "/**/*.png",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.jpg",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js")
                        .permitAll()
                    .antMatchers("/api/auth/**")
                        .permitAll()
                    .antMatchers("/api/user/checkUsernameAvailability", "/api/user/checkEmailAvailability")
                        .permitAll()
                    .antMatchers(HttpMethod.GET, "/api/polls/**", "/api/users/**")
                        .permitAll()
                    .antMatchers("/api/configuration/**")
                        .permitAll()
                    .anyRequest()
                        .authenticated()
                        .and().sessionManagement()
                        .maximumSessions(1)
                        .sessionRegistry(sessionRegistry());
        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);


    @Bean
    public SessionRegistry sessionRegistry() {
        return new SessionRegistryImpl();
    }

    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }

但是,当我尝试与用户登录时-用户可以登录任意次数。

我尝试查看用户注册表,以查看是否为每次登录创建了多个用户原则,但是没有。

我也尝试逐步通过ConcurrentSessionControlAuthenticationStrategy.onAuthentication,但是似乎没有被调用-但是我不知道为什么。

编辑:

添加客户AuthenticationEntryPoint:

@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {

    private final Logger log = LogManager.getLogger(AuthController.class);
    @Override
    public void commence(HttpServletRequest httpServletRequest,
                         HttpServletResponse httpServletResponse,
                         AuthenticationException e) throws IOException, ServletException {
        log.error("Responding with unauthorized error. Message - {}", e.getMessage());
        httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                "Sorry, You're not authorized to access this resource.");
    }
}

编辑:

现在正在会话注册表中正确设置会话设置。但是,因为我的登录端点具有allowAll()(我认为)

未调用ConcurrentSessionControlAuthenticationStrategy.onAuthentication()并将新创建的会话添加到注册表中。

我相信这可能与我的CustomAuthenticationProvider的设置方式有关:

    @PostMapping("/signin")
    public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {

        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(
                        loginRequest.getUsernameOrEmail(),
                        loginRequest.getPassword()
                )
        );

        SecurityContextHolder.getContext().setAuthentication(authentication);

        String jwt = tokenProvider.generateToken(authentication);
        return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
    }

因此登录始终允许新的登录,因为在身份验证后不会调用ConcurrentSessionControlAuthenticationStrategy.onAuthentication()。

0 个答案:

没有答案