Fügen Sie dem Tag
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>
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();
}
}
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);
}
}
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;
}
}
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