Пример за овластување за пристап заснована на улоги за безбедност на пролет


Денес ќе го разгледаме примерот за пристап и овластување базиран на пролетна безбедносна улога. Сепак, пред да ја прочитате оваа објава, ве молиме погледнете ја мојата претходна објава за „Пример за одјавување на пролетта 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 алатка за да го развиеме ова пример.

Пример за овластување за пристап заснована на улоги за безбедност на пролет

  1. Создадете проект „Simple Spring Web Maven“ во Spring STS Suite со следните детали. Име на проектот: SpringMVCSecruityMavenRolesApp2. Користете ја истата датотека pom.xml од мојот претходен пост со следните промени

<artifactId>SpringMVCSecruityMavenRolesApp</artifactId>

<build>
  <finalName>SpringMVCSecruityMavenRolesApp</finalName>
</build>
</project>

  1. Користете ги сите Java и JSP датотеки од мојот претходен пост. Овде ќе разговараме само за ажурирани или новододадени содржини.
  2. Ажурирајте ја датотеката 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"); 
		
	}
}

Објаснување на кодот

  1. Во методот configureGlobal(), додадовме двајца корисници: еден корисник со улога \ROLE_USER и друг корисник со двете улоги \ROLE_USER и \ROLE_ADMIN. Тоа значи дека овој втор корисник ќе дејствува како администратор Вака, можеме да конфигурираме кој било број на корисници и улоги.
  2. Можеме да користиме или методи на авторитети (ROLE) или улоги (ROLE) за да ги конфигурираме Улогите во нашата апликација.
  3. Разлика помеѓу методите авторитети() и roles():

    На
  • authorities() му треба целосно име на улога како \ROLE_USER
  • На
  • roles() му треба име на улога како \USER. Тоа автоматски ќе ја додаде вредноста \ROLE_ на ова име на улогата \USER.

  1. Во методот 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 Пристапот е одбиен“.

  1. Ажурирајте ја датотеката 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-адреса.

  1. \/userPage се користи од USER Role за пристап и извршување на нормални кориснички активности.
  2. \/adminPage се користи од ADMIN Role за пристап и извршување на кориснички активности на администратор. Улогата на ADMIN може да пристапи и на URL-то на \/userPage.
  3. Ажурирана датотека 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>

Овде додадовме три опции како мени на горната рамка. „Одјавување“ е веќе дискутирано во мојот претходен пост. Новите две врски се:

  1. Корисник на JD: Достапно и од улогите „КОРИСНИК“ и „АДМИН“
  2. Администратор на 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>

  1. Додајте нова датотека 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. Финалната структура на проектот изгледа вака:

Пролет безбедносни улоги Пример Тест за апликација

Се работи за пример за безбедносни улоги на пролетта за да се обезбеди овластен пристап до страниците на веб-апликациите.