หมวดหมู่: Spring Boot

Spring Security: DatabaseSpring Security: Database

โดยปกติแล้ว Spring Security ไม่ได้มีโครงสร้างตารางบังคับ (Fixed Schema) มาให้ในฐานข้อมูลครับ คุณมีอิสระในการ ออกแบบเอง (Custom Schema) เพื่อให้ตรงกับความต้องการของธุรกิจ แต่ Spring Security จะมี “รูปแบบมาตรฐาน” ที่เตรียมไว้ให้เลือกใช้ 2 ทางหลัก ๆ ดังนี้ครับ

แบบออกแบบเอง (Custom Schema) – แนะนำวิธีนี้

วิธีนี้ยืดหยุ่นที่สุด เพราะคุณสามารถเพิ่ม Column อื่น ๆ ได้ เช่น ชื่อภาษาไทย (fullName) , เบอร์โทร, หรือวันที่สมัครสมาชิก โดยโครงสร้างพื้นฐานที่ควรมีคือ

TableColumns ที่ควรมี
Usersid, username, password (ต้องเข้ารหัส BCrypt) , enabled (boolean)
Rolesid, name (เช่น ROLE_USER, ROLE_ADMIN)
User_Rolesuser_id, role_id (ตารางกลางสำหรับ Mapping สิทธิ์)

ตัวอย่าง Entity ใน Java

@Entity
@Table (name = "app_users") // ชื่อตารางใน SQL Server
public class User { @Id @GeneratedValue (strategy = GenerationType.IDENTITY) private Long id; @Column (unique = true, nullable = false) private String username; @Column (nullable = false) // เก็บ Password ที่ผ่านการ Hash แล้ว private String password; @Column (columnDefinition = "nvarchar (255) ") // รองรับภาษาไทย private String displayName; @ManyToMany (fetch = FetchType.EAGER) private Set<Role> roles;
}

แบบใช้มาตรฐานของ Spring (Default JDBC Schema)

หากคุณไม่อยากคิดเอง Spring Security มี Schema มาตรฐานที่เรียกว่า JdbcUserDetailsManager ซึ่งถ้าคุณสร้างตารางตามชื่อที่เขากำหนด เขาจะเขียน SQL เชื่อมต่อให้คุณโดยอัตโนมัติ
โครงสร้างตารางมาตรฐาน (SQL Server Syntax)

CREATE TABLE users (username VARCHAR (50) NOT NULL PRIMARY KEY, password VARCHAR (500) NOT NULL, enabled BIT NOT NULL) ; CREATE TABLE authorities (username VARCHAR (50) NOT NULL, authority VARCHAR (50) NOT NULL, CONSTRAINT fk_authorities_users FOREIGN KEY (username) REFERENCES users (username)) ;

หมายเหตุ: วิธีนี้เริ่มไม่เป็นที่นิยมในโปรเจกต์ใหม่ ๆ เพราะแก้ไขโครงสร้างยาก และผูกติดกับ Username เป็น Primary Key มากเกินไป


สรุปสิ่งที่ต้องทำใน SQL Server

คุณมี 2 ทางเลือกในการสร้างตาราง

  • ให้ Hibernate สร้างให้ (Auto) : ตั้งค่าใน application.properties เป็น spring.jpa.hibernate.ddl-auto=update แล้วเขียน Entity คลาสใน Java เมื่อรันแอปครั้งแรก มันจะไปสร้างตารางใน SQL Server ให้เองครับ
  • สร้างเองด้วย Script: เข้าไปรัน SQL Script ใน SQL Server Management Studio (SSMS) หรือผ่าน sqlcmd ใน Docker

อ่านเพิ่มเติม