Spring boot с логином angular работает, но аутентификация не сохраняется - PullRequest
0 голосов
/ 24 января 2020

У меня есть API весенней загрузки 2.2.4 с пружинной защитой, и я делаю свою собственную форму входа в систему, мне удается правильно пройти аутентификацию с использованием фреймворка, но позже по другим запросам, когда я пытаюсь извлечь объект Authentication из SecurityContext, который я получаю

"name": "anonymousUser"

Вот мой весенний конфигурационный файл безопасности:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    CustomSecurityService customSecurityService;

    @Autowired
    CustomPasswordEncoder passwordEncoder;

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

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("http://localhost:4200");
            }
        };
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/*.js", "/images/**", "/assets/**", "/favicon.ico", "/index.html", "/*.woff",
                "/*.woff2", "/*.eot", "/*.css", "/*.jpg", "/*.ttf");
    }


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

        http.authorizeRequests().antMatchers("/login", "/user").permitAll().antMatchers("/**").authenticated().and()
                .formLogin().loginProcessingUrl("/login").successHandler((request, response, authentication) -> {
                    HttpSession session = request.getSession();
                    Authentication authUser = SecurityContextHolder.getContext().getAuthentication();
                    session.setAttribute("username", authUser.getName());
                    session.setAttribute("authorities", authentication.getAuthorities());

                    // set our response to OK status
                    response.setStatus(HttpServletResponse.SC_OK);
                    response.setHeader("Access-Control-Allow-Origin", "*");
                }).and().csrf().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customSecurityService).passwordEncoder(passwordEncoder);
    }

}

как только я получаю одобренный ответ, я пытаюсь получить текущего пользователя с помощью контроллера

@GetMapping(value = "/user")
    public ResponseEntity<?> getUserDetails() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null) {
            return ResponseEntity.ok().body(auth);
        }else {
            return ResponseEntity.badRequest().build();
        }
    }

. im получить следующий ответ (в формате json для моего клиента)

{"полномочия": [{"полномочия": "ROLE_ANONYMOUS"}], "деталь": { "remoteAddress": "0: 0: 0: 0: 0: 0: 0: 1", "SESSIONID": нулевая}, "проверка подлинности": правда, "главный": "anonymousUser", "keyHa sh": - 1635720795, "credentials": "", "name": "anonymousUser"}

где моя аутентификация? в этот момент я ожидал получить пользователя, вошедшего в систему.

  • я не вмешивался в настройки сеанса и не объявил / не изменил сеанс на состояние без состояния.

  • в getUserDetails я пытался получить доступ к атрибуту сеанса имени пользователя - он нулевой, даже если я его установил.

  • последний, но не менее важный - я переопределил обработчик успеха по умолчанию потому что я не хочу, чтобы он предлагал поведение перенаправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...