Περάστε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης ασφάλειας ελατηρίου

0
Περάστε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης ασφάλειας ελατηρίου

Σε αυτό το άρθρο, θα δούμε πώς να μεταβιβάσετε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης Spring Security.

Περάστε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης ασφάλειας ελατηρίου

Υπάρχουν πολλοί τρόποι για να μεταβιβάσετε μια πρόσθετη παράμετρο με τη σελίδα ασφαλείας Spring, αλλά θα εξετάσουμε τις 2 κύριες προσεγγίσεις σε αυτήν την ενότητα. Εδώ είναι οι 2 επιλογές για να το πετύχετε:

  1. Περάστε την παράμετρο χρησιμοποιώντας την προσέγγιση φίλτρου ελέγχου ταυτότητας.
  2. Για τις περισσότερες προχωρημένες περιπτώσεις, θα χρησιμοποιήσουμε το AuthenticationDetailsSource

Για να καταλάβουμε, ας υποθέσουμε ότι θέλουμε να περάσουμε έναν κωδικό διακριτικού ασφαλείας με κάθε αίτημα σύνδεσης ως πρόσθετη παράμετρο με τη σελίδα σύνδεσης Spring Security για να τον χρησιμοποιήσουμε στη διαδικασία ελέγχου ταυτότητας.

1. Ρύθμιση έργου και Maven

Αυτό το άρθρο είναι μέρος της σειράς Spring Security και μπορείτε να κάνετε λήψη του πηγαίο κώδικα από το αποθετήριο GitHub. Εάν δημιουργείτε ένα νέο έργο, μπορείτε να χρησιμοποιήσετε το Spring Initializr για να δημιουργήσετε την αρχική ρύθμιση του έργου. Αυτό είναι το πώς μας pom.xml μοιάζει με

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository  -->
	</parent>
	<groupId>com.javadevjournal</groupId>
	<artifactId>spring-security-series</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Spring Security Tutorial Series</name>
	<description>Series to explain the core Spring security concepts.</description>

	<dependencies>
		<!-- we need dev tool only for development and not for the production -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-validation</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5 -->
		<dependency>
			<groupId>org.thymeleaf.extras</groupId>
			<artifactId>thymeleaf-extras-springsecurity5</artifactId>
			<version>3.0.4.RELEASE</version>
		</dependency>

	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2. Προσαρμοσμένο φίλτρο ελέγχου ταυτότητας

Όπως γνωρίζουμε ότι ο χρήστης ασφάλειας άνοιξης τα φίλτρα ασφαλείας για να ξεκινήσει η διαδικασία ελέγχου ταυτότητας. Η ασφάλεια της άνοιξης χρησιμοποιεί το UsernamePasswordAuthenticationFilter για να χειριστείτε τη διαδικασία σύνδεσης βάσει φόρμας. Η απλή και εύκολη επιλογή για περάστε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης Spring Security είναι να δημιουργήσετε ένα προσαρμοσμένο φίλτρο επεκτείνοντας το UsernamePasswordAuthenticationFilter και να χειριστεί τυχόν πρόσθετες παραμέτρους. Ας δούμε πώς να το κάνουμε αυτό.

public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private static final String customToken = "jdjCustomToken";

    /**
     * This is override of UsernamePasswordAuthenticationFilter
     * @param request
     * @param response
     * @return
     * @throws AuthenticationException
     */
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {

        UsernamePasswordAuthenticationToken authRequest = getAuth(request);
        setDetails(request, authRequest);
        return getAuthenticationManager().authenticate(authRequest);
    }

    /*
        We are combing the username and our custom token to pass on this data to the underlying system.
        As an alternate, you can also save it in session but keep in mind that this will only be available
        where HTTP session is available.
     */
    private UsernamePasswordAuthenticationToken getAuth(final HttpServletRequest request) {
        String username = obtainUsername(request);
        String password = obtainPassword(request);
        String customToken = obtainCustomToken(request);

        String usernameDomain = String.format("%s%s%s", username.trim(),
            String.valueOf(Character.LINE_SEPARATOR), customToken);

        return new UsernamePasswordAuthenticationToken(
            usernameDomain, password);
    }

    @Nullable
    protected String obtainCustomToken(HttpServletRequest request) {
        return request.getParameter(customToken);
    }
}

Ο παραπάνω κώδικας είναι απλός και αυτονόητος. Λαμβάνουμε το όνομα χρήστη και τον κωδικό πρόσβασης παρόμοια με τα UsernamePasswordAuthenticationFilter και μετά παίρνουμε το δικό μας customToken από το HTTPServletRequest. Συνδυάζουμε και τα δύο username και customToken και μεταβίβαση του διακριτικού στο AuthenticationManager. Το επόμενο βήμα είναι να προσαρμόσουμε την υπηρεσία προσαρμοσμένων στοιχείων χρήστη, ώστε να χρησιμοποιεί αυτές τις πληροφορίες για έλεγχο ταυτότητας.

2.1 Υπηρεσία ελατηρίου Ασφάλεια Στοιχεία χρήστη

Spring Security Ο πάροχος ελέγχου ταυτότητας DAO χρησιμοποιεί την υπηρεσία UserDetails για να λάβει τις πληροφορίες χρήστη από την υποκείμενη βάση δεδομένων. ο UserDetailsService Το συμβόλαιο ορίζει μια ενιαία μέθοδο που ονομάζεται loadUserByUsername. Θα χρησιμοποιήσουμε αυτήν τη μέθοδο για να εξαγάγουμε τόσο το όνομα χρήστη όσο και το προσαρμοσμένο διακριτικό για να εκτελέσουμε τον έλεγχο ταυτότητας.

@Service("userDetailsService")
public class CustomUserDetailService implements UserDetailsService {

    @Resource
    UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        //Let's split the email to get both values
        String[] usernameAndCustomToken = StringUtils.split(email, String.valueOf(Character.LINE_SEPARATOR));

        //if the String arrays is empty or size is not equal to 2, let's throw exception
        if (Objects.isNull(usernameAndCustomToken) || usernameAndCustomToken.length != 2) {
            throw new UsernameNotFoundException("User not found");
        }
        final String userName = usernameAndCustomToken[0];
        final String customToken = usernameAndCustomToken[1]; // use it based on your requirement
        final UserEntity customer = userRepository.findByEmail(userName);
        if (customer == null) {
            throw new UsernameNotFoundException(email);
        }
        boolean enabled = !customer.isAccountVerified(); // we can use this in case we want to activate account after customer verified the account
        UserDetails user = User.withUsername(customer.getEmail())
            .password(customer.getPassword())
            .disabled(customer.isLoginDisabled())
            .authorities(getAuthorities(customer)).build();

        return user;
    }
}

2.2. Διαμόρφωση ελατηρίου ασφαλείας

Τώρα δημιουργήσαμε το προσαρμοσμένο μας φίλτρο ασφαλείας και προσαρμόσαμε την κλάση. Το επόμενο βήμα είναι να διαμορφώσετε αυτές τις λεπτομέρειες με την ασφάλεια Spring. Θα κάνουμε τα εξής βήματα:

  1. Καταχωρίστε το προσαρμοσμένο μας φίλτρο ασφαλείας με το Spring Security.
  2. Εισαγάγετε το AuthenticationManager με το προσαρμοσμένο φίλτρο ασφαλείας μας.

Για να καταχωρήσουμε το φίλτρο ασφαλείας πελάτη, θα χρησιμοποιήσουμε το addFilterBefore μέθοδος του HTTPSecurity τάξη.

@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(authFilter(), UsernamePasswordAuthenticationFilter.class)
            .authorizeRequests()
            .antMatchers("/login", "/register", "/home")
            .permitAll()
            .antMatchers("/account/**").hasAnyAuthority("CUSTOMER", "ADMIN")
            .and()
            ....
    }
}

Το τελευταίο βήμα για να περάσετε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης ασφάλειας ελατηρίου είναι να περάσετε το AutenticationManager και Εργαλείο χειρισμού αποτυχίας ελέγχου ταυτότητας στο προσαρμοσμένο φίλτρο ασφαλείας.

@Bean
public CustomAuthenticationFilter authFilter() throws Exception {
    CustomAuthenticationFilter filter = new CustomAuthenticationFilter();
    filter.setAuthenticationManager(authenticationManagerBean());
    filter.setAuthenticationFailureHandler(failureHandler());
    return filter;
}

2.3. Σελίδα σύνδεσης

Το τελευταίο βήμα είναι να προσθέσετε το πρόσθετο πεδίο στη σελίδα σύνδεσης. Αυτό θα επιτρέψει στον πελάτη να συμπληρώσει το προσαρμοσμένο διακριτικό πριν υποβάλει το αίτημα σύνδεσης. Ένα απλό πεδίο εισαγωγής είναι εξαιρετικό για τις ανάγκες μας.

Διαφημίσεις

<div class="input-group mb-3">
  <input type="text" name="jdjCustomToken" class="form-control" placeholder="Token"/>
  <div class="input-group-append">
    <div class="input-group-text">
      <span class="fas fa-lock"></span>
    </div>
  </div>
</div>

Εάν τρέξουμε την εφαρμογή μας και ανοίξουμε τη σελίδα σύνδεσης, θα δούμε ένα επιπλέον πεδίο εισαγωγής.

Περάστε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης ασφάλειας ελατηρίου

Εάν δεν περάσουμε το διακριτικό, θα λάβουμε το σφάλμα αποτυχίας σύνδεσης, ενώ το σύστημα με το σωστό όνομα χρήστη και κωδικό πρόσβασης με διακριτικό, θα σας επιτρέψει να συνδεθείτε.

πώς να μεταβιβάσετε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης ασφάλειας ελατηρίου

3. Χρήση προσαρμοσμένου διακριτικού ελέγχου ταυτότητας

Για να μεταβιβάσουμε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης ασφαλείας ελατηρίου για πιο προχωρημένες περιπτώσεις χρήσης, μπορούμε να χρησιμοποιήσουμε μια προσαρμοσμένη AuthenticationToken σε συνδυασμό με το Προσαρμοσμένο φίλτρο ασφαλείας όπως περιγράφεται στην παραπάνω ενότητα. Θα διαβιβάσουμε αυτές τις πρόσθετες πληροφορίες στον έλεγχο ταυτότητας ασφαλείας Spring χρησιμοποιώντας ένα προσαρμοσμένο UsernamePasswordAuthenticationToken και πάροχο προσαρμοσμένου ελέγχου ταυτότητας. Πρέπει να δημιουργήσετε έναν προσαρμοσμένο πάροχο ελέγχου ταυτότητας και να χειριστείτε το support() μέθοδος ανάλογα. Εδώ είναι ένα δείγμα κώδικα για να ξεκινήσετε

Διαφημίσεις

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

   // inject anything as per your requirement

    @Override
    public Authentication authenticate(Authentication authentication) {

       // run your authetication work here
    }

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

Περίληψη

Σε αυτό το άρθρο, μιλήσαμε για το πώς να μεταβιβάσετε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης Spring Security. Η μετάδοση πρόσθετων παραμέτρων όπως το διακριτικό ασφαλείας ή άλλες λεπτομέρειες είναι μια πολύ κοινή περίπτωση χρήσης για κάθε σύγχρονη εφαρμογή. Μιλήσαμε για την απλή λύση χειρισμού αυτών των παραμέτρων χρησιμοποιώντας το φίλτρο Spring Security. Στο τέλος αυτού του άρθρου, μιλήσαμε για τη δημιουργία του δικού μας προσαρμοσμένου διακριτικού και τη διαχείριση αυτού χρησιμοποιώντας τον πάροχο προσαρμοσμένου ελέγχου ταυτότητας. Όπως πάντα, ο πηγαίος κώδικας για αυτό το άρθρο είναι διαθέσιμος στη σελίδα μας Αποθετήριο GitHub. Ενημερώστε μας σε περίπτωση που πιστεύετε ότι υπάρχει άλλη καλύτερη επιλογή για να μεταβιβάσετε μια πρόσθετη παράμετρο με τη σελίδα σύνδεσης Spring Security ή μπορούμε να το χειριστούμε διαφορετικά.

Schreibe einen Kommentar