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.
Cette fois, nous utiliserons la fonctionnalité Spring Security pour réaliser les opérations suivantes:
--Authentification
/ admin
et / user
/ user
Cette fois, nous décrirons la procédure d'activation de la sécurité pour l'application Spring Boot.
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.
L'exemple de code qui fonctionne réellement est publié sur GitHub. Si vous pouvez lire le code, veuillez visiter directement ce qui suit.
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.
spring-boot-starter-web
spring-boot-starter-thymeleaf
De plus, les bibliothèques suivantes sont requises pour activer la fonction Spring Securirty.
spring-boot-starter-security
spring-security-web
spring-security-config
Cette fois, ajoutons les bibliothèques suivantes pour intégrer Spring Security et Tymeleaf.
thymeleaf-extras-springsecurity4
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 si
gradle bootRun` réussit, vous êtes prêt.
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,
#configure(HttpSecurity)
/ user
doit être accessible par les rôles d'utilisateur général et d'utilisateur administrateur
-- / admin
n'est accessible que par les utilisateurs administrateurs/ login
Le mot de passe est le nom de propriété
password`/ user
si la connexion est réussie
--Désactiver exceptionnellement le contrôle d'accès pour les pages de connexion#configure(WebSecurity)
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.