ป้ายกำกับ: ตารางบังคับ

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

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