Spring Boot Form Security Login Example
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:
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
Username | Role | Pages Accessible | Pages not Accessible |
---|---|---|---|
javainuse | USER ADMIN | Welcome page Show All Employees Page Add Employee | None |
employee | USER | Welcome 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.
Nhập sai mật khẩu.
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.
Trên Thêm nhân viên, lấy security exception
Đă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.
Leave a Reply