🎯 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ùng | Mật khẩu | Quyền | Truy cập được |
---|---|---|---|
admin | 1234 | ROLE_ADMIN | /admin/** |
user | 1234 | ROLE_USER | /user/** |