Пример за овластување за пристап заснована на улоги за безбедност на пролет
Денес ќе го разгледаме примерот за пристап и овластување базиран на пролетна безбедносна улога. Сепак, пред да ја прочитате оваа објава, ве молиме погледнете ја мојата претходна објава за „Пример за одјавување на пролетта 4 безбедност MVC“ за да добиете некои основни знаења за безбедноста на пролетта 4.
Пролетна безбедносна улога
Во оваа објава, ќе разговараме за тоа како да се дефинираат, користат и управуваат пролетните безбедносни улоги како што се \USER, \ADMIN во Spring Web Application. Како и мојот претходен пост, овој пример за објава користи и Spring 4 MVC Security со In-Memory Store и функцијата Spring Java конфигурација за да ја развие апликацијата. Тоа значи дека нема да користиме датотека web.xml, а исто така нема да пишуваме ниту една линија пролетна XML конфигурација. Ќе ја користиме опцијата „In-Memory Store“ за складирање и управување со кориснички акредитиви. Ќе користиме Spring 4.0.2.RELEASE, Spring STS 3.7 Suite IDE, Spring TC Server 3.1 со Java 1.8 и Maven build алатка за да го развиеме ова пример.
Пример за овластување за пристап заснована на улоги за безбедност на пролет
- Создадете проект „Simple Spring Web Maven“ во Spring STS Suite со следните детали. Име на проектот: SpringMVCSecruityMavenRolesApp2. Користете ја истата датотека pom.xml од мојот претходен пост со следните промени
<artifactId>SpringMVCSecruityMavenRolesApp</artifactId>
<build>
<finalName>SpringMVCSecruityMavenRolesApp</finalName>
</build>
</project>
- Користете ги сите Java и JSP датотеки од мојот претходен пост. Овде ќе разговараме само за ажурирани или новододадени содржини.
- Ажурирајте ја датотеката LoginSecurityConfig.java за да ги конфигурирате корисничките улоги како \USER и \ADMIN. 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");
}
}
Објаснување на кодот
- Во методот configureGlobal(), додадовме двајца корисници: еден корисник со улога \ROLE_USER и друг корисник со двете улоги \ROLE_USER и \ROLE_ADMIN. Тоа значи дека овој втор корисник ќе дејствува како администратор Вака, можеме да конфигурираме кој било број на корисници и улоги.
- Можеме да користиме или методи на авторитети (ROLE) или улоги (ROLE) за да ги конфигурираме Улогите во нашата апликација.
- Разлика помеѓу методите авторитети() и roles():
- На
- authorities() му треба целосно име на улога како \ROLE_USER На
- roles() му треба име на улога како \USER. Тоа автоматски ќе ја додаде вредноста \ROLE_ на ова име на улогата \USER.
- Во методот configure(), дефиниравме различни URL-адреси со потребните Улоги за пристап.
antMatchers("/homePage")
.access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
Овој фрагмент од код конфигурира дека \/homePage е достапно и за Улогите на КОРИСНИК и за АДМИН.
.antMatchers("/userPage").access("hasRole('ROLE_USER')")
.antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')")
Овој фрагмент од код конфигурира дека \/userPage е достапно само со улогата \USER и .\/adminPage е достапно само со улогата \ADMIN. Ако другите улоги пристапат на овие страници, ќе добиеме порака за грешка „403 Пристапот е одбиен“.
- Ажурирајте ја датотеката LoginController.java Controller за да дефинирате нови патеки за пристап до URL како што е прикажано подолу. 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;
}
}
Објаснување на кодот Во прилог на претходната објава Пример, овде додадовме уште две нови URL-адреса.
- \/userPage се користи од USER Role за пристап и извршување на нормални кориснички активности.
- \/adminPage се користи од ADMIN Role за пристап и извршување на кориснички активности на администратор. Улогата на ADMIN може да пристапи и на URL-то на \/userPage.
- Ажурирана датотека homePage.jsp за да обезбеди специфични активности за Улогите на корисникот и администраторот. 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>
Овде додадовме три опции како мени на горната рамка. „Одјавување“ е веќе дискутирано во мојот претходен пост. Новите две врски се:
- Корисник на JD: Достапно и од улогите „КОРИСНИК“ и „АДМИН“
- Администратор на JD: Достапно само за двете улоги на \ADMIN
ЗАБЕЛЕШКА:- Во апликациите во реално време, ќе ја прикажеме само врската „JD User“ до улогата „КОРИСНИК“ и ќе ја сокриеме врската „JD Admin“. За да тестираме дали е достапна од „ КОРИСНИК“ Улога или не, а исто така за да ја видиме точната порака за грешка, не ја сокривме оваа врска.20. Додајте нова датотека adminPage.jsp за да дејствува како почетна страница за улогата „ADMIN“.
<%@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>
- Додајте нова датотека userPage.jsp за да дејствува како почетна страница за улогата „КОРИСНИК“. 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>
Сега го завршивме развојот на апликацијата. Време е да ја видиме конечната структура на нашиот проект и да ја тестираме апликацијата.26. Финалната структура на проектот изгледа вака:
Пролет безбедносни улоги Пример Тест за апликација
Се работи за пример за безбедносни улоги на пролетта за да се обезбеди овластен пристап до страниците на веб-апликациите.