Spring swichUserFilter перенаправляет на целевой URL без переключения - PullRequest
0 голосов
/ 24 июня 2019

У меня есть некоторые данные, которые мне нужно скопировать для userA.Так как я не знаю пароль пользователя A, я хочу войти в систему как adminUser и переключиться на пользователя A и опубликовать данные.В связи с этим у меня есть два вопроса: -

Вопрос 1) Сначала я пытаюсь войти и переключиться, используя пример, приведенный в ответе здесь Как выдать себя за пользователя, использующего SwitchUserFilter в Spring?


    private final TokenProvider tokenProvider;
    protected UserDetailsService userDetailsService;//= (UserDetailsService) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    private final CorsFilter corsFilter;
    private final SecurityProblemSupport problemSupport;



    public SecurityConfiguration(UserDetailsService userDetailsService,TokenProvider tokenProvider, CorsFilter corsFilter, SecurityProblemSupport problemSupport) {
        this.tokenProvider = tokenProvider;
        this.corsFilter = corsFilter;
        this.userDetailsService = userDetailsService;
        this.problemSupport = problemSupport;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
            .antMatchers(HttpMethod.OPTIONS, "/**")
            .antMatchers("/swagger-ui/index.html")
            .antMatchers("/test/**");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .csrf()
            .disable()
            .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
            .addFilterAfter(switchUserFilter(), FilterSecurityInterceptor.class)
            .exceptionHandling()
            .authenticationEntryPoint(problemSupport)
            .accessDeniedHandler(problemSupport)
        .and()
            .headers()
            .frameOptions()
            .disable()
        .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
            .authorizeRequests()
            .antMatchers("/api/authenticate").permitAll()
            .antMatchers("/api/register").permitAll()
            .antMatchers("/api/activate").permitAll()
            .antMatchers("/api/account/reset-password/init").permitAll()
            .antMatchers("/api/account/reset-password/finish").permitAll()
            .antMatchers("/api/**").authenticated()
            .antMatchers("/management/health").permitAll()
            .antMatchers("/management/info").permitAll()
            .antMatchers("/management/prometheus").permitAll()
            .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
            .antMatchers("/login/switchUser").permitAll()
            .antMatchers("/login/impersonate").permitAll()
        .and()
            .apply(securityConfigurerAdapter());
        // @formatter:on
    }


    @Bean
    public SwitchUserFilter switchUserFilter() {

        SwitchUserFilter filter = new SwitchUserFilter();
            filter.setUserDetailsService(userDetailsService);
            filter.setSwitchUserUrl("/login/impersonate");
            filter.setSwitchFailureUrl("/login/switchUser");
            filter.setTargetUrl("/#/home");

        return filter;      
    }


    private JWTConfigurer securityConfigurerAdapter() {
        return new JWTConfigurer(tokenProvider);
    }
}

То, что я пробовал, я вошел в систему как adminUser и в URL я пытаюсь переключиться, изменив URL на http://localhost:9000/login/impersonate?username=userA

Теперь моя проблема в том, что я успешно перенаправленна домашний экран, но мой пользователь остается adminUser.(Я делаю это по той причине, что когда я делаю вызов get / post от почтальона, я получаю ответ о том, что браузер устарел и мне нужно включить javascript)

PS: - У меня есть приложение, разработанное jhipster, поэтому большинство классовуже добавлены по умолчанию.

PPS: - Я знаю, что я чрезвычайно тупой

Вопрос 2) Как я упоминал ранее, мне нужно копировать данные и мне нужно делать это программно,Как я могу достичь этого?Может ли SwitchUserFilter вызвать URL-адрес отдыха и передать ему некоторые пользовательские данные / значения?

1 Ответ

1 голос
/ 01 июля 2019

добавить этот пользовательский метод в UserJwTController

@PostMapping("/authenticate-externalnodes")
    public ResponseEntity<JWTToken> authenticateExternalnodes(@Valid @RequestBody LoginVM loginVM) {
        // Get Roles for user via username
        Set<Authority> authorities = userService.getUserWithAuthoritiesByLogin(loginVM.getUsername()).get()
                .getAuthorities();
        // Create Granted Authority Rules
        Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
        for (Authority authority : authorities) {
            grantedAuthorities.add(new SimpleGrantedAuthority(authority.getName()));
        }
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                loginVM.getUsername(), "", grantedAuthorities);
        Authentication authentication = authenticationToken;
        SecurityContextHolder.getContext().setAuthentication(authentication);
        boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
        String jwt = tokenProvider.createToken(authentication, rememberMe);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt);
        return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK);
    }
...