[JAVA] Certification / autorisation avec Spring Security & Thymeleaf

Qu'est-ce que Spring Security?

Spring Security est un framework qui fournit des fonctions d'authentification et d'autorisation pour les applications créées avec Spring. Vous pouvez ajouter les fonctions suivantes à votre application Web en ajoutant simplement quelques paramètres.

supposition

Que faire cette fois

Cette fois, nous utiliserons la fonctionnalité Spring Security pour réaliser les opérations suivantes:

--Authentification

Cette fois, nous décrirons la procédure d'activation de la sécurité pour l'application Spring Boot.

Version de la bibliothèque

Spring Boot utilise la série 1.4 et Spring Securiry utilise la série 4.x. Veuillez noter que si les versions sont différentes, la grammaire sera complètement différente.

Exemple de code

L'exemple de code qui fonctionne réellement est publié sur GitHub. Si vous pouvez lire le code, veuillez visiter directement ce qui suit.

Préparation

Ajouter des bibliothèques dépendantes

Cette fois, nous allons construire le côté serveur avec Spring Boot et dessiner l'écran en utilisant Tymeleaf comme moteur de modèle. Pour cela, les bibliothèques suivantes sont nécessaires.

De plus, les bibliothèques suivantes sont requises pour activer la fonction Spring Securirty.

Cette fois, ajoutons les bibliothèques suivantes pour intégrer Spring Security et Tymeleaf.

En résumé, les paramètres suivants seront ajoutés à build.gradle.

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.4.1.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf:1.4.1.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-security:1.4.1.RELEASE")
    compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.3.RELEASE")
    compile("org.springframework.security:spring-security-core:4.2.3.RELEASE")
    compile("org.springframework.security:spring-security-web:4.2.3.RELEASE")
    compile("org.springframework.security:spring-security-config:4.2.3.RELEASE")
}

Controller Tout d'abord, créez un écran pour l'administrateur et un écran pour les utilisateurs généraux. Pour les administrateurs, utilisez ʻAdminController, et pour les utilisateurs généraux, utilisez ʻUserController.

@Controller
@RequestMapping("/admin")
@Slf4j
public class AdminController {

    @RequestMapping
    public String index() {
        return "admin";
    }
}
@Controller
@RequestMapping("/user")
@Slf4j
public class UserController {

    @RequestMapping
    public String index() {
        return "user";
    }

}

Template Préparez le modèle Tymeleaf correspondant au contrôleur ci-dessus. Disons respectivement ʻadmin.html et ʻuser.html (voir l'exemple de code pour plus de détails).

Après cela, créez ʻApplication.javaselon la méthode de SpringBoot, et sigradle bootRun` réussit, vous êtes prêt.

Exemple d'implémentation

Maintenant que nous sommes prêts, passons à Spring Security.

Config Tout d'abord, créez une classe de configuration pour activer Spring Security. Spring Security est activé en fournissant une classe qui hérite de WebSecurityConfigurerAdapter et a @ EnableWebSecurity.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static String ROLE_USER = "USER";
    private static String ROLE_ADMIN = "ADMIN";

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/user").hasAnyRole(ROLE_USER, ROLE_ADMIN)
                .antMatchers("/admin").hasRole(ROLE_ADMIN)
                .and()

                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/user")
                .usernameParameter("username")
                .passwordParameter("password")
                .permitAll()
                .and()

                .logout()
                .permitAll()
                .and()

                .csrf();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
                .antMatchers("/*.html", "/*.css")
                .antMatchers("/bootstrap/**");
    }

}

Pour expliquer brièvement ce que nous faisons dans l'exemple ci-dessus,

Comme ça. Je pense que la mise en œuvre est telle que vous pouvez imaginer les réglages.

Cette fois, nous devons définir une instance de TemplateResolver dans SpringTemplateEngine pour fonctionner avec Tymeleaf. La mise en œuvre spécifique est la suivante.

@Autowired
public TemplateResolver templateResolver;

@Bean
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.addDialect(new SpringSecurityDialect());
    engine.setTemplateResolver(templateResolver);
    return engine;
}

En outre, définissez le nom d'utilisateur et le mot de passe utilisés pour l'authentification. Cette fois, pour simplifier la mise en œuvre, il est mis en mémoire et non à partir de la base de données. Voir un exemple de code pour ʻUserDto`.

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    UserDto support = supportUser();
    UserDto admin = adminUser();

    auth.inMemoryAuthentication()
        .withUser(support.getUsername()).password(support.getPassword()).roles(ROLE_USER)
        .and()
        .withUser(admin.getUsername()).password(admin.getPassword()).roles(ROLE_ADMIN);
}

@Bean
@ConfigurationProperties("inmotion.admin")
public UserDto adminUser() {
    return new UserDto();
}

@Bean
@ConfigurationProperties("inmotion.user")
public UserDto supportUser() {
    return new UserDto();
}

Je laisserai le nom d'utilisateur et le mot de passe réels dans ʻapplication.yml`.

inmotion:
  user:
    username: user
    password: pass12345
  admin:
    username: admin
    password: pass12345

Controller Après cela, préparez un contrôleur correspondant à l'écran de connexion,

@Controller
public class AuthenticationController {

    @RequestMapping({"/", "/login"})
    public String login(@RequestParam(value = "error", required = false) String error, Model model) {
        if (error != null) {
            //Traitement pour sortir un message d'erreur
        }
        return "login";
    }

}

Template Tout ce que vous avez à faire est de préparer un formulaire de connexion pour POST avec / login.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <form class="form-signin" method="post" th:action="@{/login}">
        <div class="alert alert-dismissible alert-danger" th:if="${errorMessage}">
            <button type="button" class="close" data-dismiss="alert">×</button>
            <p th:text="${errorMessage}"></p>
        </div>
        <h2 class="form-signin-heading">Please sign in</h2>
        <label for="username" class="sr-only">Username</label>
        <input type="text" id="username" name="username" class="form-control" placeholder="UserName"/>
        <label for="password" class="sr-only">Password</label>
        <input type="password" id="password" name="password" class="form-control" placeholder="Password"/>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </form>
</div>
</body>
</html>

Démarrez l'application avec gradle bootRun et

Allons vérifier.

Matériel de référence

Recommended Posts

Certification / autorisation avec Spring Security & Thymeleaf
Authentification / autorisation de mémo d'utilisation de Spring Security
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
Ajoutez vos propres éléments d'authentification avec Spring Security
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Fonction de connexion avec Spring Security
Utiliser l'authentification de base avec Spring Boot
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Découvrez l'architecture de traitement de l'authentification Spring Security
Authentification Oauth2 avec Spring Cloud Gateway
Une erreur 404 se produit lors du test de l'authentification par formulaire avec Spring Security
Implémenter CRUD avec Spring Boot + Thymeleaf + MySQL
Utiliser les balises JSP Spring Security avec FreeMarker
Implémenter la fonction de pagination avec Spring Boot + Thymeleaf
Comment Spring Security fonctionne avec Hello World
Exécutez l'application WEB avec Spring Boot + Thymeleaf
Hash des mots de passe avec Spring Boot + Spring Security (avec sel, avec étirement)
Rendre les pages HTML dynamiques avec thymeleaf (spring + gradle)
Créez une application CRUD avec Spring Boot 2 + Thymeleaf + MyBatis
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0
Construisez un système WEB avec Spring + Doma + H2DB + Thymeleaf
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Spring Security soulève 403 interdits
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
Générer du JavaScript avec Thymeleaf
Expérimentons le flux d'octroi de code d'autorisation avec Spring Security OAuth-Part 1: Review of OAuth 2.0
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
Appelez votre propre méthode avec PreAuthorize dans Spring Security
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
Télécharger avec Spring Boot
Créer une authentification par clé API pour l'API Web dans Spring Security
Ajoutez vos propres éléments d'authentification avec Spring Security
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Utilisez thymeleaf3 avec le parent sans spécifier spring-boot-starter-parent dans Spring Boot
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
Connectez-vous avec HttpServletRequest # login dans Spring Security dans l'environnement Servlet 3.x
Générer un code à barres avec Spring Boot
Utiliser Thymeleaf avec Azure Functions
Hello World avec Spring Boot
Configuration Java avec Spring MVC
Authentification de base avec Java 11 HttpClient
Mémo d'utilisation de Spring Security CSRF
Spring with Kotorin --- 8. Couche de référentiel
Démarrez avec Spring Boot
Mémo d'utilisation de Spring Security Run-As
Bonjour tout le monde avec Spring Boot!
Spring avec Kotorin --6 Traitement asynchrone
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
[Java] Thymeleaf Basic (Spring Boot)
Spring Security Usage Memo Method Security
Mémo d'utilisation de Spring Security Remember-Me
Ressort avec Kotorin ―― 7. Couche de service
Utilisation de Mapper avec Java (Spring)
Spring Boot à partir de Docker