Phân quyền theo ROLE – ROLE_USER vs ROLE_ADMIN

🎯 Bài 3 (Phần mở rộng): Phân quyền theo ROLE – ROLE_USER vs ROLE_ADMIN


🔐 1️⃣ Cập nhật lớp UserDetailsService

Ví dụ: một người dùng có thể có "ROLE_ADMIN":

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// Demo hardcoded
if (username.equals("admin")) {
return new User("admin", passwordEncoder.encode("1234"),
Collections.singleton(new SimpleGrantedAuthority("ROLE_ADMIN")));
} else {
return new User("user", passwordEncoder.encode("1234"),
Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")));
}
}

🔒 2️⃣ Phân quyền trong cấu hình bảo mật

Trong SecurityConfig.java, bạn có thể phân quyền như sau:

t@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests()
.requestMatchers("/admin/**").hasRole("ADMIN") // chỉ admin
.requestMatchers("/user/**").hasRole("USER") // chỉ user
.requestMatchers("/", "/login").permitAll() // tất cả
.and()
.formLogin()
.defaultSuccessUrl("/", true)
.and()
.logout()
.logoutSuccessUrl("/login?logout");
}

🔁 Chú ý: hasRole("ADMIN") sẽ tự động hiểu là "ROLE_ADMIN" vì Spring thêm "ROLE_" nội bộ.


🧪 3️⃣ Test: Tạo các controller tương ứng

@GetMapping("/admin/dashboard")
public String adminPage() {
return "Admin content!";
}

@GetMapping("/user/dashboard")
public String userPage() {
return "User content!";
}

✅ Tóm lại:

Người dùngMật khẩuQuyềnTruy cập được
admin1234ROLE_ADMIN/admin/**
user1234ROLE_USER/user/**

Comments are closed.