Spring Security trong MVC 4 Sử dụng Spring Boot

Vâng, sau một thời gian khá dài, gần một năm, tôi đã sẵn sàng để xuất bản bài viết tiếp theo của tôi ở đây. Đây là một bài đăng đã quá hạn lâu và được yêu cầu cao. Tôi sẽ viết về cách bảo mật ứng dụng web Spring MVC 4 bằng Spring Security. Tôi sẽ sử dụng Spring Boot để xây dựng một ứng dụng nhanh chóng và không cần cấu hình. Tôi đã viết chi tiết về cách sử dụng Spring Boot trong ứng dụng Spring Data Rest tại đây .
Spring Boot có thể được sử dụng với các công cụ xây dựng như Maven hoặc Gradle. Các công cụ xây dựng này giúp bạn chia sẻ các bình giữa các ứng dụng khác nhau, xây dựng ứng dụng của bạn và tạo báo cáo. Tôi sẽ sử dụng cùng một ứng dụng được cung cấp trong hướng dẫn bắt đầu bảo mật mùa xuân nhưng với JSP để xem.
Thiết lập dự án với Spring Boot

2. Nhấp vào Tiếp theo -> Kiểm tra Tạo một dự án đơn giản -> Cung cấp vị trí không gian làm việc



Khi chúng tôi thực hiện xong dự án ở cuối hướng dẫn này, cấu trúc dự án sẽ trông như thế này,

4. Hãy để chúng tôi tạo một ứng dụng mvc mùa xuân rất đơn giản và bảo mật nó bằng cách sử dụng bảo mật mùa xuân. Viết lại tệp pom.xml của bạn để khớp với những gì được cung cấp bên dưới.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.programmingfree</groupId>
<artifactId>pf-securing-web</artifactId>
<version>0.1.0</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
- Nếu bạn nhận thấy trong pom.xml ở trên, chúng tôi đang thêm hai phụ thuộc được đưa ra bên dưới vì chúng tôi đang sử dụng JSP cho các khung nhìn.
<sự phụ thuộc>
<groupId> org.apache.tomcat.embed </groupId>
<artifactId> tomcat-nhúng-jasper </artifactId>
<scope> được cung cấp </scope>
</dependency>
<sự phụ thuộc>
<groupId> javax.servlet </groupId>
<artifactId> jstl </artifactId>
</dependency>
- Mặc dù chúng tôi sử dụng "chiến tranh" để đóng gói, chúng tôi vẫn có thể thực hiện nó. Điều này được thực hiện bởi 'spring-boot-maven-plugin'.
- Chúng tôi có 'spring-boot-starter-security' là một trong những phần phụ thuộc và điều này sẽ khởi động mọi thứ liên quan đến bảo mật cho chúng tôi.
5. Tạo từng khung nhìn bên trong WEB-INF \ jsp.
src \ main \ webapp \ WEB-INF \ jsp \ home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>Spring Security Example - ProgrammingFree</title>
</head>
<body>
<h1>Welcome!</h1>
<p>Click <a href="<spring:url value='/hello' />">here</a> to see a greeting.</p>
</body>
</html>
Đây là một trang chào mừng đơn giản và nó sẽ không được bảo mật. Trang này có liên kết đến trang chào mừng (hello.jsp) chỉ có thể được truy cập sau khi được xác thực.
src \ main \ webapp \ WEB-INF \ jsp \ hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello <b><c:out value="${pageContext.request.remoteUser}"/></b> </h1>
<form action="/logout" method="post">
<input type="submit" value="Sign Out"/>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
</body>
</html>
Trang này hiển thị thông báo chào mừng với tên của người dùng đã đăng nhập và chỉ những người dùng đã xác thực mới có thể truy cập được.
src \ main \ webapp \ WEB-INF \ jsp \ login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>Spring Security Example </title>
</head>
<body>
<c:if test="${param.error ne null}">
<div>
Invalid username and password.
</div>
</c:if>
<c:if test="${param.logout ne null}">
<div>
You have been logged out.
</div>
</c:if>
<form action="/login" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>
Như tên của chính nó, trang này chứa biểu mẫu đăng nhập để người dùng gửi thông tin đăng nhập của họ.
6. Tạo ba lớp java bên trong một gói có tên là 'hello' với mã được đưa ra bên dưới.
src \ main \ java \ hello \ MvcConfig.java
package hello;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/home").setViewName("home");
registry.addViewController("/").setViewName("home");
registry.addViewController("/hello").setViewName("hello");
registry.addViewController("/login").setViewName("login");
}
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
return resolver;
}
}
src \ main \ java \ hello \ WebSecurityConfig.java
package hello;
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.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
src \ main \ java \ hello \ Application.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Throwable {
SpringApplication.run(Application.class, args);
}
}
Đó là tất cả! Bây giờ để chạy ứng dụng, nhấp chuột phải vào dự án, chạy dưới dạng Maven Build với mục tiêu, cài đặt sạch Spring-boot: run
Thao tác này sẽ cài đặt dự án với tất cả các phụ thuộc cần thiết, tạo tệp chiến tranh trong thư mục đích và khởi động máy chủ tomcat nhúng được cung cấp bởi khởi động mùa xuân. Mở trình duyệt và nhấn http: // localhost: 8080 / để xem trang chủ,

Khi nhấp vào liên kết cho tin nhắn chào mừng, người dùng sẽ được chuyển hướng đến trang đăng nhập như hình dưới đây,




Làm thế nào nó hoạt động
Trước tiên, hãy để tôi bắt đầu với thiết lập ứng dụng. Trong suốt quá trình thực hiện, chúng tôi không viết bất kỳ cấu hình xml nào và thậm chí cả web.xml cũng bị loại bỏ khi sử dụng Spring Boot. Hãy để tôi đi từng bước về cách Spring Boot thiết lập ứng dụng cho chúng ta,
1. Sau khi maven tải tất cả các thư viện cần thiết vào classpath (WEB-INF \ lib), Spring Boot sẽ xem xét classpath và đưa ra các giả định hợp lý về những gì bạn đang thiếu và thêm nó.
2. Spring Boot khởi chạy ứng dụng từ một lớp được chú thích bằng @SpringBootApplication, vì vậy trong ví dụ của chúng tôi, nó bắt đầu bằng 'Application.java'
@SpringBootApplication là một chú thích tiện lợi bổ sung tất cả những điều sau:
- @Configuration gắn thẻ lớp như một nguồn định nghĩa bean cho ngữ cảnh ứng dụng.
- @EnableAutoConfiguration yêu cầu Spring Boot bắt đầu thêm các bean dựa trên cài đặt classpath, các bean khác và các cài đặt thuộc tính khác nhau.
- Thông thường, bạn sẽ thêm @EnableWebMvc cho ứng dụng Spring MVC, nhưng Spring Boot sẽ tự động thêm nó khi thấy spring-webmvc trên classpath. Thao tác này gắn cờ ứng dụng là một ứng dụng web và kích hoạt các hành vi chính như thiết lập DispatcherServlet.
- @ComponentScan yêu cầu Spring tìm kiếm các thành phần, cấu hình và dịch vụ khác bên trong cùng một gói với nó. Trong trường hợp này, nó tìm kiếm tất cả các lớp bên trong gói 'hello'.
An ninh mùa xuân
Cuối cùng, chúng tôi cần cung cấp cho người dùng một cách để hiển thị tên người dùng hiện tại và Đăng xuất. Cập nhật hello.html để chào người dùng hiện tại và chứa biểu mẫu "Đăng xuất" như được hiển thị bên dưới
Tấn công CSRF
Có thể bạn quan tâm
