[JAVA] Authentifizieren Sie 3 oder mehr Parameter im JSON-Format mit Spring Security

Einführung

In Spring Security wird standardmäßig die Formularauthentifizierung verwendet, und die Parameternamen lauten "Benutzername" und "Kennwort". Wenn Sie nicht so aufwändig sein müssen, können Sie die Codemenge mithilfe des Standardauthentifizierungsmechanismus reduzieren. In letzter Zeit nimmt die Authentifizierung im JSON-Format jedoch zu, sodass Sie sie mit Spring Security anpassen können Ich habe versucht, verschiedene Dinge herauszufinden.

Authentifizierungsparameter

Die Parameter für diese Authentifizierung sind wie folgt.

Parametername Inhalt
email Mail Adresse
password Passwort
tenantCode Mandantencode

Verfahren

1. Bereiten Sie eine Klasse zum Speichern von Parametern für die Authentifizierung vor

Principal.java


@Getter
@Setter
public class Principal {
  private String email;
  private String tenantCode;
  private String password;
}

2. Bereiten Sie eine Klasse zum Speichern von Anmeldebenutzerinformationen vor

LoginUser.java


@Getter
@Setter
public class LoginUser extends org.springframework.security.core.userdetails.User{
  private long userId;
  private String userName;
  //Fügen Sie weitere Eigenschaften hinzu, die Sie behalten möchten
}

3. Bereiten Sie einen Filter für die Vorverarbeitung der Authentifizierung vor

CustomAuthenticationFilter.java


public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

  @Override
  public Authentication attemptAuthentication(HttpServletRequest request,
      HttpServletResponse response) {

    try {
      Principal principal = new ObjectMapper().readValue(request.getInputStream(),
          Principal.class);

      UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
          principal, null);

      setDetails(request, authRequest);

      return this.getAuthenticationManager().authenticate(authRequest);

    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  @Override
  protected void successfulAuthentication(HttpServletRequest req,
      HttpServletResponse res,
      FilterChain chain,
      Authentication auth) {

    SecurityContextHolder.getContext().setAuthentication(auth);

  }
}

4. Bereiten Sie eine Klasse für die Authentifizierungsverarbeitung vor

CustomAuthenticationProvider.java


@Configuration
public class CustomAuthenticationProvider implements AuthenticationProvider {

  //Benutzerinformations-Repository
  @Autowired
  UserRepository userRepository;

  //Mandanteninformations-Repository
  @Autowired
  TenantRepository tenantRepository;

  @Override
  public Authentication authenticate(Authentication authentication) throws AuthenticationException {

    //Rufen Sie ab, was von der CustomAuthenticationFilter-Klasse übergeben wurde
    Principal principal = (Principal) authentication.getPrincipal();

    if (principal == null) {
      throw new BadCredentialsException("Keine Anmeldeinformationen");
    }

    //Überprüfung des gültigen Mandantencodes
    Tenant tenant = tenantRepository.findByTenantCode(principal.getTenantCode());
    if (tenant == null || tenant.getStatus() == 0) {
      throw new BadCredentialsException("Der Mieter ist ungültig");
    }

        //Gültigkeitsprüfung der Benutzer anhand der E-Mail-Adresse und des Mandantencodes
    User user = userRepository.findByEmailAndTenantId(principal.getEmail(), tenant.getId());

    //Wenn Benutzerinformationen nicht abgerufen werden konnten
    if (user == null) {
      throw new BadCredentialsException("Benutzer existiert nicht");
    }

    if (!new BCryptPasswordEncoder().matches(principal.getPassword(), user.getPassword())) {
      throw new BadCredentialsException("dein Passwort ist falsch");
    }

    List<GrantedAuthority> authorityList = new ArrayList<>();

    //Berechtigungsverarbeitung

        LoginUser loginUser = new LoginUser();
    loginUser.setUserId(user.getId());
    loginUser.setUserName(user.getUserName());

    return new UsernamePasswordAuthenticationToken(loginUser, principal.getPassword(),
        authorityList);
  }

  @Override
  public boolean supports(Class<?> authentication) {
    return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
  }

}

5. Bereiten Sie eine Vererbungsklasse für `` `WebSecurityConfigurerAdapter``` vor

SecurityConfig.java


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Autowired
  CustomAuthenticationProvider authenticationProvider;

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

    CustomAuthenticationFilter filter = new CustomAuthenticationFilter();
    filter.setRequiresAuthenticationRequestMatcher(
        new AntPathRequestMatcher("<Anmelde-URL>", "POST"));
    filter.setAuthenticationManager(authenticationManagerBean());

    http
        .csrf()
        .disable()
        .authorizeRequests()
        .antMatchers("<URL, für die keine Authentifizierung erforderlich ist>")
        .permitAll()
        .anyRequest()
        .authenticated()
        .and()
        .logout()
        .logoutRequestMatcher(
            new AntPathRequestMatcher("<Abmelde-URL>", "POST"))
        .and()
        .addFilter(filter);
  }

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

Referenz

Recommended Posts

Authentifizieren Sie 3 oder mehr Parameter im JSON-Format mit Spring Security
Spring Boot-Protokoll im JSON-Format ausgeben
Versuchen Sie es mit der JSON-Format-API in Java
Protokollausgabe im Json-Format mit lograge / lograge-sql mit RubyOnRails
Versuchen Sie es mit Spring Boot Security
Spring Boot Tutorial Verwenden der Spring Security-Authentifizierung
[Spring MVC] Implementieren Sie die in der URL enthaltenen dynamischen Parameter ohne Verwendung von Optional (~ Java7).
Einstellungen beim Aufrufen der API mithilfe von CSRF-Maßnahmen von Spring Security in JMeter
Wie Bean-Eigenschaften Anforderungsparameter im Listenstil in Spring binden
Setzen Sie das Spring Security-Authentifizierungsergebnis auf JSON
Existiert mit der Spezifikation in Spring Data JPA
Ausgabe Bean als JSON im Frühjahr