Spring Security ist ein Framework, das Authentifizierungs- und Autorisierungsfunktionen für mit Spring erstellte Anwendungen bereitstellt. Sie können Ihrer Webanwendung die folgenden Funktionen hinzufügen, indem Sie einige Einstellungen hinzufügen.
Dieses Mal verwenden wir die Spring Security-Funktion, um Folgendes zu erreichen:
--Authentifizierung --Form Authentifizierung mit Benutzer und Passwort
/ admin
und / user
zugreifenDieses Mal beschreiben wir das Verfahren zum Aktivieren der Sicherheit für die Spring Boot-Anwendung.
Spring Boot verwendet die Serie 1.4 und Spring Securiry die Serie 4.x. Bitte beachten Sie, dass die Grammatik völlig unterschiedlich ist, wenn die Versionen unterschiedlich sind.
Der Beispielcode, der tatsächlich funktioniert, wird auf GitHub veröffentlicht. Wenn Sie den Code lesen können, besuchen Sie bitte Folgendes direkt.
Dieses Mal werden wir die Serverseite mit Spring Boot erstellen und den Bildschirm mit Tymeleaf als Template-Engine zeichnen. Dafür werden folgende Bibliotheken benötigt.
spring-boot-starter-web
spring-boot-starter-thymeleaf
Darüber hinaus sind die folgenden Bibliotheken erforderlich, um die Spring Securirty-Funktion zu aktivieren.
spring-boot-starter-security
spring-security-web
spring-security-config
Fügen wir dieses Mal die folgenden Bibliotheken hinzu, um Spring Security und Tymeleaf zu integrieren.
thymeleaf-extras-springsecurity4
Zusammenfassend werden die folgenden Einstellungen zu "build.gradle" hinzugefügt.
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 Erstellen Sie zunächst einen Bildschirm für den Administrator und einen Bildschirm für allgemeine Benutzer. Verwenden Sie für Administratoren "AdminController" und für allgemeine Benutzer "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 Bereiten Sie die Tymeleaf-Vorlage vor, die dem obigen Controller entspricht. Nehmen wir "admin.html" bzw. "user.html" an (Einzelheiten finden Sie im Beispielcode).
Danach erstellen Sie "Application.java" gemäß der SpringBoot-Methode, und wenn "gradle bootRun" erfolgreich ist, können Sie loslegen.
Nun, da wir bereit sind, gehen wir zu Spring Security über.
Config Erstellen Sie zunächst eine Konfigurationsklasse, um Spring Security zu aktivieren. Spring Security wird aktiviert, indem eine Klasse bereitgestellt wird, die "WebSecurityConfigurerAdapter" erbt und "@ EnableWebSecurity" hat.
@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/**");
}
}
Um kurz zu erklären, was wir im obigen Beispiel tun:
#configure(HttpSecurity)
/ user
sollte für die Rollen des allgemeinen Benutzers und des Administratorbenutzers zugänglich sein
Auf "/ admin" kann nur von Administratoren zugegriffen werdenBenutzername
Passwort ist Eigenschaftsname Passwort
/ user
, wenn die Anmeldung erfolgreich ist#configure(WebSecurity)
So was. Ich denke, dass die Implementierung so ist, dass Sie sich die Einstellungen vorstellen können.
Dieses Mal müssen wir eine Instanz von "TemplateResolver" in "SpringTemplateEngine" festlegen, um mit Tymeleaf arbeiten zu können. Die spezifische Implementierung ist wie folgt.
@Autowired
public TemplateResolver templateResolver;
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.addDialect(new SpringSecurityDialect());
engine.setTemplateResolver(templateResolver);
return engine;
}
Legen Sie außerdem den Benutzernamen und das Kennwort fest, die für die Authentifizierung verwendet werden. Dieses Mal wird es zur Vereinfachung der Implementierung im Speicher und nicht in der Datenbank festgelegt. Siehe Beispielcode für "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();
}
Ich werde den tatsächlichen Benutzernamen und das Passwort in application.yml
behalten.
inmotion:
user:
username: user
password: pass12345
admin:
username: admin
password: pass12345
Controller Bereiten Sie danach einen Controller vor, der dem Anmeldebildschirm entspricht.
@Controller
public class AuthenticationController {
@RequestMapping({"/", "/login"})
public String login(@RequestParam(value = "error", required = false) String error, Model model) {
if (error != null) {
//Verarbeitung zur Ausgabe einer Fehlermeldung
}
return "login";
}
}
Template Sie müssen lediglich ein Anmeldeformular für POST mit "/ login" erstellen.
<!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>
Starten Sie die Anwendung mit gradle bootRun
und
Lass uns nachsehen.
Recommended Posts