[JAVA] Implementierung der Anmeldefunktion durch Spring Security (securityConfig)

Implementierung der Login-Authentifizierungsfunktion mit Spring Security (securityConfig)

Verfahren

  1. Fügen Sie zu pom.xml hinzu
  2. Erstellen einer securityConfig-Klasse 3.UserDetailsServiceImpl: Erstellen Sie eine Serviceklasse
  3. Erstellen Sie die LoginUser-Domäne
  4. Erstellen Sie eine Repository-Klasse für den Benutzer

1. Fügen Sie zu pom.xml hinzu

Fügen Sie dem Tag die folgenden zwei hinzu

pom.xml



		<!-- Spring Security -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.thymeleaf.extras</groupId>
			<artifactId>thymeleaf-extras-springsecurity5</artifactId>
		</dependency>

2. Erstellen einer securityConfig-Klasse

securityConfig.java



//Import weggelassen

@Configuration //Klasse für die Konfiguration
@EnableWebSecurity //Nutzen Sie die Webfunktionen von Spring Security
public class SecurityConfig extends WebSecurityConfigurerAdapter {


	@Autowired
	private UserDetailsService memberDetailsService;

	/**
	 *Durch Überschreiben dieser Methode
	 *"Sicherheitseinstellungen" für bestimmte Anforderungen
	 *Sie können Einstellungen vornehmen, die sich auf das Ganze beziehen, z. B. Einstellungen, die ignoriert werden sollen.
	 *Deaktivieren Sie insbesondere die Sicherheitseinstellungen für statische Ressourcen.
	 * 
	 * @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.WebSecurity)
	 */
	@Override
	public void configure(WebSecurity web) throws Exception {
		web.ignoring()
			.antMatchers( "/css/**"
						, "/img/**"
						, "/js/**"
						, "/fonts/**");
	}

	/**
	 *Durch Überschreiben dieser Methode können Sie die Autorisierung festlegen und sich anmelden./Sie können Einstellungen für die Abmeldung vornehmen.
	 * 
	 * @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
	 */
	@Override
	protected void configure(HttpSecurity http) throws Exception {

		http.authorizeRequests() //Autorisierungseinstellungen
			.antMatchers("/","/login","/excuteLogin","/login/register").permitAll() //「/Erlauben Sie allen Benutzern, wie z
			.antMatchers().hasRole("ADMIN") // /admin/Auf Pfade, die mit beginnen, kann nur zugegriffen werden, wenn Sie mit ADMIN-Berechtigungen angemeldet sind("ROLLE" beim Festlegen von Berechtigungen_Geben Sie die Zeichenfolge ohne "" an.)
            .antMatchers().hasRole("USER")
			//.antMatchers("/admin/**").hasRole("ADMIN") // /admin/Auf Pfade, die mit beginnen, kann nur zugegriffen werden, wenn Sie mit ADMIN-Berechtigungen angemeldet sind("ROLLE" beim Festlegen von Berechtigungen_Geben Sie die Zeichenfolge ohne "" an.)
			//.antMatchers("/user/**").hasRole("USER") // /user/Auf Pfade, die mit beginnen, kann nur zugegriffen werden, wenn Sie mit USER-Berechtigungen angemeldet sind("ROLLE" beim Festlegen von Berechtigungen_Geben Sie die Zeichenfolge ohne "" an.)
			.anyRequest().authenticated(); //Andere Pfade erfordern eine Authentifizierung

		http.formLogin() //Login-Einstellungen
			.loginPage("/login") //Pfad zum Übergang zum Anmeldebildschirm(Wenn Sie einen Pfad angeben, für den eine Anmeldeauthentifizierung erforderlich ist, und Sie nicht angemeldet sind, werden Sie zu diesem Pfad weitergeleitet.)
			.loginProcessingUrl("/excuteLogin") //Pfad zum Übergang, wenn die Anmeldetaste gedrückt wird(Wenn Sie hierher wechseln, werden Sie automatisch angemeldet.)
			.failureUrl("/login?error=true") //Pfad zum Übergang zum Anmeldefehler
			.defaultSuccessUrl("/", true) //1. Argument:Standardmäßig der Übergangspfad bei erfolgreicher Anmeldung
			                                        //2. Argument: true :Wechseln Sie nach der Authentifizierung immer zum Pfad des ersten Arguments
			                                        //         false:Selbst wenn Sie nicht authentifiziert sind und einmal zum Anmeldebildschirm übersprungen werden, wechseln Sie beim Anmelden zur angegebenen URL
			.usernameParameter("email") //Fordern Sie den Parameternamen des Benutzernamens an, der während der Authentifizierung verwendet wird(Diesmal benutze ich eine E-Mail-Adresse)
			.passwordParameter("password"); //Fordern Sie den Parameternamen des zur Authentifizierung verwendeten Kennworts an
		
		http.logout() //Abmeldeeinstellungen
			.logoutRequestMatcher(new AntPathRequestMatcher("/logout**")) //Pfad zum Übergang beim Abmelden
			.logoutSuccessUrl("/login") //Pfad zum Übergang nach dem Abmelden(Stellen Sie hier den Anmeldebildschirm ein)
			.deleteCookies("JSESSIONID") //Löschen Sie nach dem Abmelden die im Cookie gespeicherte Sitzungs-ID
			.invalidateHttpSession(true); // true:Sitzung nach dem Abmelden deaktivieren false:Deaktivieren Sie die Sitzung nicht
		
	}

	/**
	 *Einstellungen im Zusammenhang mit "Authentifizierung".<br>
	 *Einstellungen von "User Details Service" zum Erwerb authentifizierter Benutzer<br>
	 *"Password Encoder" -Einstellungen für die Passwortüberprüfung
	 * 
	 * @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder)
	 */
	@Override
	public void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(memberDetailsService)
			.passwordEncoder(new BCryptPasswordEncoder());
	}

    /**
     * <pre>
     *Gibt die Implementierung mit dem bcrypt-Algorithmus an Hash zurück.
     *Indem Sie dies angeben, wenn das Passwort gehasht und die Übereinstimmung bestätigt wird
     * @Autowired
	 * private PasswordEncoder passwordEncoder;
	 *Wenn Sie schreiben, wird es DI sein.
     * </pre>
     * @Ein Implementierungsobjekt, das mit dem return bcrypt-Algorithmus gehasht wird
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
    		return new BCryptPasswordEncoder();
    }
}

3. Erstellen Sie UserDetailsServiceImpl

Eine Serviceklasse zum Abrufen von Benutzerinformationen und Durchführen der Anmeldeauthentifizierung basierend auf der vom Browser eingegebenen E-Mail-Adresse. Der Quellcode lautet wie folgt.

UserDetailsServiceImpl.java




@Service
public class UserDetailsServiceImpl implements UserDetailsService {
	/**Repository zum Abrufen von Informationen aus der Datenbank*/

	@Autowired
	private UserRepository userRepository;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.security.core.userdetails.UserDetailsService#
	 * loadUserByUsername(java.lang.String)Suchen Sie in der Datenbank, konfigurieren Sie die Anmeldeinformationen und geben Sie sie zurück.
	 */
	@Override
	public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
		User user = userRepository.findByMailAddress(email);
		if (user == null) {
			throw new UsernameNotFoundException("Die E-Mail ist nicht registriert.");
		}
		//Beispiel für eine Autorisierung
		Collection<GrantedAuthority> authorityList = new ArrayList<>();
		authorityList.add(new SimpleGrantedAuthority("ROLE_USER")); //Gewähren Sie Benutzerrechte
//			if(member.isAdmin()) {
//				authorityList.add(new SimpleGrantedAuthority("ROLE_ADMIN")); //Gewähren Sie Administratorrechte
//			}
		return new LoginUser(user, authorityList);
	}	
}

4. Erstellen Sie die LoginUser-Domäne

LoginUser.java



/**
 *Entität, in der Administratoranmeldeinformationen gespeichert sind.
 *
 */
public class LoginUser extends User {


	private static final long serialVersionUID = 1L;
	/**Nutzerinformation*/
	private final com.example.domain.User user;

	/**
	 *Legen Sie zusätzlich zu den normalen Administratorinformationen Berechtigungsrollen fest.
	 * 
	 * @param Administrator Administratorinformationen
	 * @param AuthorityList Liste mit Berechtigungsinformationen
	 */
	public LoginUser(com.example.domain.User user, Collection<GrantedAuthority> authorityList) {
		super(user.getEmail(), user.getPassword(), authorityList);
		this.user = user;
	}

	public com.example.domain.User getUser() {
		return user;
	}
}

5. Erstellen eines UserRepository

Ein Repository zum Suchen von Benutzern nach E-Mail-Adresse. Es ist erforderlich, eine Domänenklasse für den Benutzer separat zu erstellen, diesmal wird sie jedoch weggelassen.

UserRepository.java




public class UserRepository {
	
	@Autowired
	private NamedParameterJdbcTemplate template;
	
	private static final RowMapper<User> USER_ROW_MAPPER = (rs, i) -> {
		User user = new User();
		user.setId(rs.getInt("id"));
		user.setName(rs.getString("name"));
		user.setEmail(rs.getString("email"));
		user.setPassword(rs.getString("password"));
		user.setZipcode(rs.getString("zipcode"));
		user.setAddress(rs.getString("address"));
		user.setTelephone(rs.getString("telephone"));

		return user;
	};
	
	/**
	 *Erhalten Sie 1 Benutzerinformationen von der E-Mail-Adresse
	 * @param email
	 * @return List<User>
	 */
	public User findByMailAddress(String email) {
		String sql = "select id,name,email,password,zipcode,address,telephone from users where email = :email";
		
		SqlParameterSource param = new MapSqlParameterSource().addValue("email", email);
		
		List<User> userList = template.query(sql, param, USER_ROW_MAPPER);
		
		if(userList.size() == 0) {
			return null;
		}
		return userList.get(0);
	}

Hinweis 1: Bei der Anmeldung mit implementierter Spring Security müssen die in der Datenbank gespeicherten Kennwortinformationen gehasht werden. Weitere Informationen zum Kennwort-Hashing finden Sie in einem anderen Artikel, wenn Sie Benutzerinformationen registrieren.

Recommended Posts

Implementierung der Anmeldefunktion durch Spring Security (securityConfig)
Anmeldefunktion mit Spring Security
Implementierte Authentifizierungsfunktion mit Spring Security ②
Implementierte Authentifizierungsfunktion mit Spring Security ③
Implementierte Authentifizierungsfunktion mit Spring Security ①
Teil 1: Versuchen Sie, die von Spring Security 5 unterstützte OAuth 2.0-Anmeldung mit Spring Boot zu verwenden
Anmeldefunktion
Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)
Teil 2: Verstehen Sie (ungefähr) den Prozessablauf der OAuth 2.0-Anmeldung, die von Spring Security 5 unterstützt wird
Implementierung der DM-Funktion
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
[JQuery] Implementierungsverfahren der AutoComplete-Funktion [Java / Spring]
Erstellen Sie mit Spring Security eine Anmelde- / Abmeldefunktion gemäß dem offiziellen Spring-Leitfaden [für Anfänger].
Teil 3: Verstehen Sie den Prozessablauf der OAuth 2.0-Anmeldung, die von Spring Security 5 unterstützt wird, (gründlich)
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
Informationen zur Spring Security-Authentifizierung
Implementierung der Kommentarfunktion (Ajax)
Implementierung der Ajax-Funktion (Follow Function)
Implementierung der Bildvorschau-Funktion
Spring Security erhöht 403 verboten
Implementierung der Pagenationsfunktion
Hash beim Spring-Boot das Passwort und verwenden Sie die Mitgliederregistrierung und die Spring-Sicherheit, um die Anmeldefunktion zu implementieren.
Implementieren Sie die Anmeldefunktion in Rails einfach mit Name und Passwort (1)
Implementieren Sie die Anmeldefunktion in Rails einfach mit nur einem Namen und einem Passwort (2).
[Ruby on Rails] Implementieren Sie die Anmeldefunktion von add_token_to_users mit API
Melden Sie sich mit HttpServletRequest # in Spring Security in der Servlet 3.x-Umgebung an