xiaoming-master/yeb

关于登陆后无法获取当前用户信息的问题---Spring Security

Opened this issue · 0 comments

在配置 SecurityConfig的configure(WebSecurity) 方法时,可以配置直接放行的请求

    @Override
    public void configure(WebSecurity web) throws Exception {
        //需要直接放行的请求,不会进入过滤器链
        web.ignoring().mvcMatchers(
                "/css/**",
                "/js/**",
                "index.html",
                "/favicon.ico",
                "/doc.html",
                "/webjars/**",
                "/swagger-resources/**",
                "v2/api-docs/**"

        );
    }

这些请求不会进入到security的过滤器链中,所以,登陆接口"/login"不能在这里配置,
如果放在这里,登录请求将不走 SecurityContextPersistenceFilter 过滤器,也就意味着不会将登录用户信息存入 session,进而导致后续请求无法获取到登录用户信息。

应当在SecurityConfig的configure(HttpSecurity http)中配置

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //使用jwt不需要csrf
        http.csrf()
                .disable()
                .sessionManagement()
                //基于token不需要session
//                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/login", "/logout")
                .permitAll()
                //其他所有的请求都需要验证
                .anyRequest()
                .authenticated();
//                .and()
//                //不用缓存
//                .headers()
//                .cacheControl();
        //jwt验证过滤器
        http.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
        //添加未授权,未登陆处理器
        http.exceptionHandling()
                //没有权限
                .accessDeniedHandler(restAccessDeniedHandler)
                //没有登陆
                .authenticationEntryPoint(restAuthenticationEntryPoint);
    }

同时需要开启session,才能获取登陆用户信息