Индивидуальный ответ на вход в Spring Security Basi c Auth - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть таблица с именем "user_detail", имеющая столбцы имя, фамилия, имя пользователя, пароль. Эту таблицу я использую для basi c auth.

В настоящее время, когда я даю имя пользователя, пароль в / login Затем контроллер проверяет данные таблицы. Я хочу, чтобы при успешном входе в систему было возвращено имя.

Ниже приведен мой код.

public class LoginController {


    @GetMapping(path = "/login")
    public LoginResponse login() {
        return new LoginResponse("You are authenticated");
    }
}


@Configuration
@EnableWebSecurity
public class SpringSecurityConfigurationBasicAuth extends WebSecurityConfigurerAdapter {

    @Autowired
    MongoUserDetailsService userDetailsService;

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

        AuthenticationEntryPoint entryPoint = new CustomAuthenticationEntryPoint();


        http
                .csrf().disable()
                .authorizeRequests().anyRequest().authenticated()
                .and().httpBasic().authenticationEntryPoint(entryPoint).and()
                .exceptionHandling().authenticationEntryPoint(entryPoint)
                .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.cors().configurationSource(request -> new CorsConfiguration().applyPermitDefaultValues());



    }

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

    @Override
    public void configure(AuthenticationManagerBuilder builder) throws Exception {
        builder.userDetailsService(userDetailsService);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/user-registration/users");
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowCredentials(true);
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        configuration.setAllowedMethods(Arrays.asList("GET"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

public @Data class LoginResponse {

    private String message;

    public LoginResponse(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}


@Component
public class MongoUserDetailsService implements UserDetailsService {

    @Autowired
    MongoOperations mongoOperations;


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        Query query = new Query(Criteria.where("emailId").is(username));
        List<UserDetailData> user = mongoOperations.find(query, UserDetailData.class, "user_details");

        if (CollectionUtils.isEmpty(user)) {
            throw new UsernameNotFoundException("User not found");
        }

        List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority("user"));

        return new User(user.get(0).getEmailId(), user.get(0).getPassword(), authorities);
    }

}

В настоящее время возвращается «Вы аутентифицированы», вместо этого я хочу указать имя пользователя из БД для этого имени пользователя.

1 Ответ

0 голосов
/ 06 февраля 2020

Вы можете попробовать использовать http.successHandler(handler). В самом примитивном случае обработчик может расширять класс SimpleUrlAuthenticationSuccessHandler. Этот обработчик перенаправляет пользователя на произвольный URL после аутентификации.

Если имя получено из БД, вы можете передать его с помощью пользовательского объекта пользователя:

public class ExtendedUser extends User {

  private static final long serialVersionUID = -1;
  private String name;

  ExtendedUser(String email, String password, boolean enabled,
                    Collection<? extends GrantedAuthority> authorities,
                    String name) {
      super(email, password, enabled, true, true, true, authorities);
      this.name = name;
  }
  // getter and setter
}

Затем используйте этот класс в вашем UserDetailsService вместо простого «Пользователь». После этого в обработчике успеха вы можете получить его как authentication.getPrincipal() в onAuthenticationSuccess методе. Затем вы можете поместить его в качестве параметра запроса URL перенаправления

...