Рубрики
Без рубрики

Форма безопасности Spring для входа в систему с использованием базы данных

– Вход в систему с помощью формы безопасности Spring с использованием базы данных

В этом уроке мы покажем вам, как выполнить аутентификацию базы данных (с использованием XML и аннотаций) в Spring Security.

Используемые технологии:

  1. Пружина 3.2.8. ОСВОБОЖДЕНИЕ
  2. Защита пружины 3.2.3.ОСВОБОЖДЕНИЕ
  3. Весенний JDBC 3.2.3.ВЫПУСК
  4. Затмение 4.2
  5. JDK 1.6
  6. Мавен 3
  7. Кот 6 или 7 (сервлет 3.x)
  8. Сервер MySQL 5.6

Предыдущая аутентификация в форме входа в память будет использована повторно, улучшена для поддержки следующих функций:

  1. Аутентификация базы данных с использованием Spring-JDBC и MySQL.
  2. Spring Security, JSP taglib, сек: авторизовать доступ="Роль ('РОЛЕВОЙ_ПОЛЬЗОВАТЕЛЬ')
  3. Настройте страницу 403, доступ к которой запрещен.

1. Демонстрация проекта

2. Каталог проектов

Просмотрите окончательную структуру проекта (на основе XML):

Просмотрите окончательную структуру проекта (на основе аннотаций):

3. Зависимости проекта

Получите зависимость для Spring, Spring Security, JDBC, Taglib и MySQL

	
		1.6
		3.2.8.RELEASE
		3.2.3.RELEASE
		1.2
		5.1.30
	

	

		
		
			org.springframework
			spring-core
			${spring.version}
		

		
			org.springframework
			spring-web
			${spring.version}
		

		
			org.springframework
			spring-webmvc
			${spring.version}
		

		
			org.springframework
			spring-jdbc
			${spring.version}
		

		
		
			org.springframework.security
			spring-security-web
			${spring.security.version}
		

		
			org.springframework.security
			spring-security-config
			${spring.security.version}
		

		
		
			org.springframework.security
			spring-security-taglibs
			${spring.security.version}
		

		
		
			jstl
			jstl
			${jstl.version}
		

                
		
			mysql
			mysql-connector-java
			${mysql.connector.version}
		

	
	

4. База данных

Чтобы выполнить проверку подлинности базы данных, необходимо создать таблицы для хранения сведений о пользователях и ролях. Пожалуйста, обратитесь к этому Ссылка на схему пользователя Spring Security . Вот сценарии MySQL для создания пользователей и роли пользователей таблицы.

4.1 Создайте таблицу “пользователи”.

CREATE  TABLE users (
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(45) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1 ,
  PRIMARY KEY (username));

4.2 Создайте таблицу “роли пользователя”.

CREATE TABLE user_roles (
  user_role_id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(45) NOT NULL,
  role varchar(45) NOT NULL,
  PRIMARY KEY (user_role_id),
  UNIQUE KEY uni_username_role (role,username),
  KEY fk_username_idx (username),
  CONSTRAINT fk_username FOREIGN KEY (username) REFERENCES users (username));

4.3 Вставляет некоторые записи для тестирования.

INSERT INTO users(username,password,enabled)
VALUES ('mkyong','123456', true);
INSERT INTO users(username,password,enabled)
VALUES ('alex','123456', true);

INSERT INTO user_roles (username, role)
VALUES ('mkyong', 'ROLE_USER');
INSERT INTO user_roles (username, role)
VALUES ('mkyong', 'ROLE_ADMIN');
INSERT INTO user_roles (username, role)
VALUES ('alex', 'ROLE_USER');
  1. Имя пользователя “mkyong”, с ролевым пользователем и ролевым администратором.
  2. Имя пользователя “alexa”, с ролью_пользователя.

5. Конфигурация безопасности Spring

Безопасность Spring как в XML, так и в аннотациях.

5.1 Создайте источник данных для подключения MySQL.



	

		
		
		
		
	


Эквивалент весенних аннотаций:

package com.mkyong.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@EnableWebMvc
@Configuration
@ComponentScan({ "com.mkyong.web.*" })
@Import({ SecurityConfig.class })
public class AppConfig {

	@Bean(name = "dataSource")
	public DriverManagerDataSource dataSource() {
	    DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
	    driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
	    driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/test");
	    driverManagerDataSource.setUsername("root");
	    driverManagerDataSource.setPassword("password");
	    return driverManagerDataSource;
	}
	
	@Bean
	public InternalResourceViewResolver viewResolver() {
	    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
	    viewResolver.setViewClass(JstlView.class);
	    viewResolver.setPrefix("/WEB-INF/pages/");
	    viewResolver.setSuffix(".jsp");
	    return viewResolver;
	}
	
}

5.2 Используйте jdbc-user-service для определения запроса для выполнения аутентификации базы данных.



    
	
		
		
		
		
		
		
		
		
		
		
	
	
	
	
	  
		
	  
	


Эквивалент аннотаций безопасности Spring:

package com.mkyong.config;

import javax.sql.DataSource;
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 SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	DataSource dataSource;
	
	@Autowired
	public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
		
	  auth.jdbcAuthentication().dataSource(dataSource)
		.usersByUsernameQuery(
			"select username,password, enabled from users where username=?")
		.authoritiesByUsernameQuery(
			"select username, role from user_roles where username=?");
	}	
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {

	  http.authorizeRequests()
		.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
		.and()
		  .formLogin().loginPage("/login").failureUrl("/login?error")
		  .usernameParameter("username").passwordParameter("password")
		.and()
		  .logout().logoutSuccessUrl("/login?logout")
		.and()
		  .exceptionHandling().accessDeniedPage("/403")
		.and()
		  .csrf();
	}
}

6. Страницы JSP

Страницы JSP для пользовательской страницы входа в систему.

6.1 Страница по умолчанию, показывает использование Spring Security JSP taglib sec: авторизация для отображения контента пользователям, имеющим полномочия ” ROLE_USER “.

<%@taglib prefix="sec"
	uri="http://www.springframework.org/security/tags"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


	

Title : ${title}

Message : ${message}

User : ${pageContext.request.userPrincipal.name} | Logout

6.2 Страница для отображения пользовательской формы входа.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>


Login Page




	

Spring Security Login Form (Database Authentication)

Login with Username and Password

${error}
${msg}
User:
Password:

6.3 Эта страница защищена паролем, доступ разрешен только авторизованному пользователю ” ROLE_ADMIN “.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>


	

Title : ${title}

Message : ${message}

Welcome : ${pageContext.request.userPrincipal.name} | Logout

6.4 Пользовательская страница 403, доступ к которой запрещен.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


	

HTTP Status 403 - Access is denied

You do not have permission to access this page!

Username : ${username}
You do not have permission to access this page!

7. Пружинный контроллер MVC

Простой контроллер.

package com.mkyong.web.controller;

import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
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 MainController {

	@RequestMapping(value = { "/", "/welcome**" }, method = RequestMethod.GET)
	public ModelAndView defaultPage() {

	  ModelAndView model = new ModelAndView();
	  model.addObject("title", "Spring Security Login Form - Database Authentication");
	  model.addObject("message", "This is default page!");
	  model.setViewName("hello");
	  return model;

	}

	@RequestMapping(value = "/admin**", method = RequestMethod.GET)
	public ModelAndView adminPage() {

	  ModelAndView model = new ModelAndView();
	  model.addObject("title", "Spring Security Login Form - Database Authentication");
	  model.addObject("message", "This page is for ROLE_ADMIN only!");
	  model.setViewName("admin");
	  return model;

	}

	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public ModelAndView login(@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 username and password!");
	  }

	  if (logout != null) {
		model.addObject("msg", "You've been logged out successfully.");
	  }
	  model.setViewName("login");

	  return model;

	}
	
	//for 403 access denied page
	@RequestMapping(value = "/403", method = RequestMethod.GET)
	public ModelAndView accesssDenied() {

	  ModelAndView model = new ModelAndView();
		
	  //check if user is login
	  Authentication auth = SecurityContextHolder.getContext().getAuthentication();
	  if (!(auth instanceof AnonymousAuthenticationToken)) {
		UserDetails userDetail = (UserDetails) auth.getPrincipal();	
		model.addObject("username", userDetail.getUsername());
	  }
		
	  model.setViewName("403");
	  return model;

	}

}

8. Демонстрация

8.1. Страница по умолчанию XML – http://localhost:8080/spring-security-loginform-database/ Аннотация – http://localhost:8080/spring-security-loginform-database-annotation/

8.2 Попытайтесь получить доступ к /странице администратора , доступ разрешен только “mkyong” ROLE_ADMIN .

8.3. Если “алекс” пытается получить доступ /администратор , отображается страница 403 доступ запрещен.

8.3 “алекс” на странице по умолчанию, покажите использование сек.: авторизовать

8.4. Если “mkyong” пытается получить доступ /администратор , отображается страница администратора.

Скачать Исходный Код

Рекомендации

  1. Справочник по безопасности Spring – jdbc-ser-сервис
  2. Справочник по безопасности Spring – juser-схема
  3. Справочник по безопасности Spring – теги
  4. Пример аннотации Spring Security Hello World
  5. Создание Пользовательской формы входа в систему
  6. Spring Security – Как настроить страницу 403, доступ к которой запрещен

Оригинал: “https://mkyong.com/spring-security/spring-security-form-login-using-database/”