Spring Boot Form Security Login Example

Spring Boot Starters & Common Configurations Thực hành

Trong một bài đăng trước, mình đã triển khai một Spring Boot Security Hello World Application. Nó đã sử dụng Http Security cơ bản. Ngoài việc không hữu ích về mặt hình ảnh, nó còn có một số nhược điểm khác như sau khi đăng nhập, sau đó để đăng xuất người dùng phải đóng trình duyệt.

Trong ví dụ này, mình sử dụng login form do Spring Security cung cấp để xác thực người dùng.

Maven Project:

boot-35_10

pom.xml:

<?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>com.javainuse</groupId>
	<artifactId>boot-form-handling</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>boot-form-handling</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
			<version>5.1.21</version>
		</dependency>

		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>Code language: HTML, XML (xml)

Tiếp theo, mình cấu hình Spring Security. Trong cấu hình, mình chỉ định các url nào sẽ bị chặn và sẽ được truy cập bởi người dùng nào và có vai trò nào. Tiếp theo, mình tạo người dùng cùng với mật khẩu và chỉ định họ một vai trò.

Mình sẽ sẽ tạo hai thông tin đăng nhập

UsernameRolePages AccessiblePages not Accessible
javainuseUSER
ADMIN
Welcome page
Show All Employees Page
Add Employee
None
employeeUSERWelcome page
Show All Employees Page
Add Employee
package com.javainuse.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.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class EmployeeSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/welcome")
            .hasAnyRole("USER", "ADMIN").antMatchers("/getEmployees").hasAnyRole("USER", "ADMIN")
            .antMatchers("/addNewEmployee").hasAnyRole("ADMIN").anyRequest().authenticated().and().formLogin()
            .permitAll().and().logout().permitAll();

        http.csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder authenticationMgr) throws Exception {
        authenticationMgr.inMemoryAuthentication().withUser("employee").password("employee")
            .authorities("ROLE_USER").and().withUser("javainuse").password("javainuse")
            .authorities("ROLE_USER", "ROLE_ADMIN");
    }

}Code language: JavaScript (javascript)

Đây là những thay đổi java duy nhất được yêu cầu.

Sự thay đổi khác nằm ở phía JSP. Spring Security cung cấp thông tin đăng nhập mặc định và trang đăng xuất. Trang đăng nhập sẽ được gọi tự động khi Spring chặn tất cả các url nào được xác thực.

menu.jsp:

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

<div style="border: 1px solid #ccc; padding: 5px; margin-bottom: 20px;">

    <a href="/welcome">Home</a> |  

    <a href="/addNewEmployee">Add
        Employee</a> |   <a
        href="/getEmployees">Show
        Employees</a> |   <u><h2 style="color: red;">
            <a onclick="document.forms['logoutForm'].submit()">Logout</a>
            </h3></u>

    <form id="logoutForm" method="POST" action="/logout">
    </form>


</div>Code language: HTML, XML (xml)

Đây là những thay đổi duy nhất được yêu cầu.

Truy cập localhost:8080/welcome, chúng ta sẽ được chuyển hướng đến trang login mặc định.

boot-35_1

Nhập sai mật khẩu.

boot-35_11

Nhập thông tin đăng nhập chính xác là nhân viên và nhân viên. Người dùng sẽ có thể xem the welcome và hiển thị tất cả các trang nhân viên nhưng không thể xem trang thêm nhân viên.

boot-35_2
boot-35_3
boot-35_4

Trên Thêm nhân viên, lấy security exception

boot-35_5

Đăng xuất. Và đăng nhập bằng thông tin đăng nhập bằng javainuse và javainuse Người dùng sẽ có thể xem tất cả các trang bao gồm cả trang thêm nhân viên.

boot-35_12
boot-35_7
boot-35_8
boot-35_9

https://www.javainuse.com/spring/boot_form_security

Leave a Reply

Your email address will not be published. Required fields are marked *