Поиск по сайту:

Пример авторизации доступа на основе ролей Spring Security


Сегодня мы рассмотрим пример доступа и авторизации на основе роли безопасности Spring. Однако, прежде чем читать этот пост, ознакомьтесь с моим предыдущим постом «Пример выхода из Spring 4 Security MVC», чтобы получить некоторые базовые знания о Spring 4 Security.

Весенняя роль безопасности

В этом посте мы обсудим, как определять, использовать и управлять ролями безопасности Spring, такими как «ПОЛЬЗОВАТЕЛЬ», «АДМИН» в веб-приложении Spring. Как и в моем предыдущем посте, в этом примере также используется Spring 4 MVC Security с In-Memory Store и Spring Java Configuration Feature для разработки приложения. Это означает, что мы не собираемся использовать файл web.xml, а также не будем писать ни одной строки конфигурации Spring XML. Мы будем использовать опцию «In-Memory Store» для хранения учетных данных пользователя и управления ими. Мы собираемся использовать Spring 4.0.2.RELEASE, Spring STS 3.7 Suite IDE, Spring TC Server 3.1 с Java 1.8 и инструмент сборки Maven для разработки этого пример.

Пример авторизации доступа на основе ролей Spring Security

  1. Создайте проект «Simple Spring Web Maven» в Spring STS Suite со следующими сведениями. Название проекта: SpringMVCSecruityMavenRolesApp2. Используйте тот же файл pom.xml из моего предыдущего поста со следующими изменениями

<artifactId>SpringMVCSecruityMavenRolesApp</artifactId>

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

<старт=\4\>

  • Используйте все файлы Java и JSP из моего предыдущего поста. Здесь мы будем обсуждать только обновленный или недавно добавленный контент.
  • Обновите файл LoginSecurityConfig.java, чтобы настроить роли пользователей, например \ПОЛЬЗОВАТЕЛЬ и \АДМИНИСТР. 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. Разница между методами author() и roles():

    • authorities() требует полного имени роли, например \ROLE_USER”
    • roles() необходимо имя роли, например \USER. Он автоматически добавит значение \ROLE_ к этому имени роли \USER.

    <старт=\5\>

  • В методе 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 доступен только для роли \ПОЛЬЗОВАТЕЛЬ, а .\/adminPage доступен только для роли \АДМИНИСТР. Если другие роли получат доступ к этим страницам, мы получим сообщение об ошибке доступа «403 Access is Denied».

    <старт=\10\>

  • Обновите файл контроллера LoginController.java, чтобы определить новые пути доступа к URL, как показано ниже. Логинконтроллер.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 используется ролью ПОЛЬЗОВАТЕЛЯ для доступа и выполнения обычных действий пользователя.
    2. \/adminPage используется ролью ADMIN для доступа и выполнения действий администратора. Роль 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» на роль «ПОЛЬЗОВАТЕЛЬ» и скроем ссылку «Администратор JD». Чтобы проверить, доступна ли она для роли «ПОЛЬЗОВАТЕЛЬ» или нет, а также чтобы увидеть точное сообщение об ошибке, мы не скрыли эту ссылку.20. Добавьте новый файл 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>
    

    <старт=\23\>

  • Добавьте новый файл userPage.jsp, который будет использоваться в качестве домашней страницы для роли \USER. 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. Окончательная структура проекта выглядит так:

    Тест приложения Spring Security Roles Пример

    Это все, что касается примера ролей безопасности Spring для предоставления авторизованного доступа к страницам веб-приложений.