Vandaag gaan we kijken naar een voorbeeld van role-based access en autorisatie met Spring Security. Voordat je dit bericht leest, ga alsjeblieft door mijn vorige bericht over “Spring 4 Security MVC Login Logout Example” om wat basiskennis op te doen over Spring 4 Security.
Spring Security Role
In dit bericht zullen we bespreken hoe je spring security rollen zoals “USER” en “ADMIN” definieert, gebruikt en beheert in een Spring Webapplicatie. Net als in mijn vorige bericht maakt dit voorbeeld ook gebruik van Spring 4 MVC Security met In-Memory Store en de Spring Java Configuration Feature om de applicatie te ontwikkelen. Dat betekent dat we geen gebruik zullen maken van het web.xml-bestand en ook geen enkele regel Spring XML-configuratie zullen schrijven. We zullen de optie “In-Memory Store” gebruiken om gebruikersreferenties op te slaan en te beheren. Voor dit voorbeeld gebruiken we Spring 4.0.2.RELEASE, Spring STS 3.7 Suite IDE, Spring TC Server 3.1 met Java 1.8 en de Maven-buildtool.
Spring Security Role Based Access Authorization Example
- Creëer een “Simple Spring Web Maven” Project in de Spring STS Suite met de volgende details.
Projectnaam: SpringMVCSecruityMavenRolesApp2. Gebruik hetzelfde pom.xml-bestand als in mijn vorige bericht met de volgende wijzigingen
<artifactId>SpringMVCSecruityMavenRolesApp</artifactId>
<build>
<finalName>SpringMVCSecruityMavenRolesApp</finalName>
</build>
</project>
- Gebruik alle Java- en JSP-bestanden uit mijn vorige bericht. We bespreken hier alleen bijgewerkte of nieuw toegevoegde inhoud.
- Werk het bestand LoginSecurityConfig.java bij om Gebruikersrollen zoals “USER” en “ADMIN” te configureren.
LoginSecurityConfig.java
package com.journaldev.spring.secuity.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder authenticationMgr) throws Exception {
authenticationMgr.inMemoryAuthentication()
.withUser("jduser").password("jdu@123").authorities("ROLE_USER")
.and()
.withUser("jdadmin").password("jda@123").authorities("ROLE_USER","ROLE_ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/homePage").access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
.antMatchers("/userPage").access("hasRole('ROLE_USER')")
.antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')")
.and()
.formLogin().loginPage("/loginPage")
.defaultSuccessUrl("/homePage")
.failureUrl("/loginPage?error")
.usernameParameter("username").passwordParameter("password")
.and()
.logout().logoutSuccessUrl("/loginPage?logout");
}
}
Code-uitleg
- In de methode configureGlobal() hebben we twee gebruikers toegevoegd: één gebruiker met de rol “ROLE_USER” en een andere gebruiker met zowel de rollen “ROLE_USER” als “ROLE_ADMIN”. Dat betekent dat deze tweede gebruiker zal fungeren als een beheerdergebruiker. Op deze manier kunnen we elk aantal gebruikers en rollen configureren.
- We kunnen zowel de authorities(ROLE) als roles(ROLE) methoden gebruiken om rollen in onze applicatie te configureren.
- Verschil tussen de methods authorities() en roles():
- authorities() heeft de volledige rol naam nodig zoals “ROLE_USER”
- roles() heeft alleen de rol naam nodig zoals “USER”. Het voegt automatisch de waarde “ROLE_” toe aan deze rol naam.
- In de methode configure() hebben we verschillende URL’s gedefinieerd met vereiste Toegangsrollen.
antMatchers("/homePage")
.access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
Deze code snippet configureert dat “/homePage” beschikbaar is voor zowel USER- als ADMIN-rollen.
.antMatchers("/userPage").access("hasRole('ROLE_USER')")
.antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')")
Deze code snippet configureert dat “/userPage” alleen toegankelijk is voor de rol “USER” en “/adminPage” alleen toegankelijk is voor de rol “ADMIN”. Als andere rollen deze pagina’s proberen te openen, krijgen we de foutmelding “403 Toegang geweigerd”.
- Het Controller-bestand LoginController.java bijwerken om nieuwe URL-toegangspaden te definiëren zoals hieronder weergegeven.
LoginController.java
package com.journaldev.spring.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class LoginController {
@RequestMapping(value = { "/"}, method = RequestMethod.GET)
public ModelAndView welcomePage() {
ModelAndView model = new ModelAndView();
model.setViewName("welcomePage");
return model;
}
@RequestMapping(value = { "/homePage"}, method = RequestMethod.GET)
public ModelAndView homePage() {
ModelAndView model = new ModelAndView();
model.setViewName("homePage");
return model;
}
@RequestMapping(value = {"/userPage"}, method = RequestMethod.GET)
public ModelAndView userPage() {
ModelAndView model = new ModelAndView();
model.setViewName("userPage");
return model;
}
@RequestMapping(value = {"/adminPage"}, method = RequestMethod.GET)
public ModelAndView adminPage() {
ModelAndView model = new ModelAndView();
model.setViewName("adminPage");
return model;
}
@RequestMapping(value = "/loginPage", method = RequestMethod.GET)
public ModelAndView loginPage(@RequestParam(value = "error",required = false) String error,
@RequestParam(value = "logout", required = false) String logout) {
ModelAndView model = new ModelAndView();
if (error != null) {
model.addObject("error", "Invalid Credentials provided.");
}
if (logout != null) {
model.addObject("message", "Logged out from JournalDEV successfully.");
}
model.setViewName("loginPage");
return model;
}
}
Code-uitleg Naast het vorige voorbeeldbericht hebben we hier twee nieuwe URL’s toegevoegd.
-
“/gebruikerPagina” wordt gebruikt door de rol GEBRUIKER om normale gebruikersactiviteiten uit te voeren.
-
“/adminPagina” wordt gebruikt door de rol ADMIN om beheerdersactiviteiten uit te voeren. De rol ADMIN heeft ook toegang tot de URL “/gebruikerPagina”.
-
De homePage.jsp is bijgewerkt om specifieke activiteiten voor gebruikers- en beheerdersrollen te bieden.
homePage.jsp
<%@taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core"%>
<a href="${pageContext.request.contextPath}/userPage">JD User</a> | <a href="${pageContext.request.contextPath}/adminPage">JD Admin</a> | <a href="javascript:document.getElementById('logout').submit()">Logout</a>
<h3>Welcome to JournalDEV Tutorials</h3>
<ul>
<li>Java 8 tutorial</li>
<li>Spring tutorial</li>
<li>Gradle tutorial</li>
<li>BigData tutorial</li>
</ul>
<c:url value="/logout" var="logoutUrl" />
<form id="logout" action="${logoutUrl}" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
Hier hebben we drie menu-opties toegevoegd aan de bovenste frame. “Uitloggen” is al besproken in mijn vorige bericht. De nieuwe twee links zijn:
- JD-gebruiker: Toegankelijk door zowel de rollen “GEBRUIKER” als “ADMIN”
- JD-beheerder: Alleen toegankelijk door beide rollen “ADMIN”
OPMERKING:- In realtime toepassingen zullen we alleen de link “JD-gebruiker” tonen aan de rol “GEBRUIKER” en de link “JD-beheerder” verbergen. Om te testen of deze toegankelijk is voor de rol “GEBRUIKER” of niet, en ook om de exacte foutmelding te zien, hebben we deze link niet verborgen.20. Voeg een nieuw adminPage.jsp-bestand toe om te fungeren als een startpagina voor de rol “ADMIN”.
adminPage.jsp
<%@taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core"%>
<h3>Welcome to JournalDEV Tutorials</h3>
<h3>Admin Page</h3>
<c:url value="/logout" var="logoutUrl" />
<form id="logout" action="${logoutUrl}" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
<c:if test="${pageContext.request.userPrincipal.name != null}">
<a href="javascript:document.getElementById('logout').submit()">Logout</a>
</c:if>
- Voeg een nieuw userPage.jsp-bestand toe om te dienen als een startpagina voor de “USER”-rol.
userPage.jsp
<%@taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core"%>
<h3>Welcome to JournalDEV Tutorials</h3>
<h3>User Page</h3>
<c:url value="/logout" var="logoutUrl" />
<form id="logout" action="${logoutUrl}" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
<c:if test="${pageContext.request.userPrincipal.name != null}">
<a href="javascript:document.getElementById('logout').submit()">Logout</a>
</c:if>
We hebben nu onze applicatieontwikkeling voltooid. Het is tijd om onze projectdefinitieve structuur te bekijken en de applicatie te testen. 26. De definitieve projectstructuur ziet er als volgt uit:
Voorbeeldtoepassing Spring Security Rollen Test
- Klik met de rechtermuisknop op het project in de Spring STS IDE en selecteer de optie “Run AS >> Run on Server”. Het zal de standaard welkomstpagina van de applicatie openen zoals hieronder weergegeven:
3. Klik op de link “Login to JournalDEV”. Nu ben je op de inlogpagina.
5. Log eerst in met “USER” Rol Referenties:
Gebruikersnaam: jduser Wachtwoord: jdu@123Nu zullen we de startpagina van de applicatie zien met 3 menulinks: “JD User”, “JD Admin” en “Logout”. Klik op de link “JD User”. Omdat we zijn ingelogd op de applicatie met “USER” Rol Referenties, kunnen we deze link openen zoals hieronder wordt getoond.
Gebruik gewoon de pijl naar achteren in de Spring STS IDE en klik deze keer op de link “JD Admin”.
Omdat we zijn ingelogd met “USER” Rol Referenties, kunnen we deze link niet openen. Daarom zien we dit foutbericht: “403 Toegang geweigerd”.9. Log nu uit en log opnieuw in met ADMIN Rol Referenties
Gebruikersnaam: jdadmin Wachtwoord: jda@123 Deze keer kunnen we de link “JD Admin” succesvol openen zoals hieronder wordt weergegeven.Test de “Logout” link om uit te loggen uit de applicatie.
Dat gaat allemaal over het voorbeeld van Spring-beveiligingsrollen om geautoriseerde toegang tot webapplicatiepagina’s te bieden.