Json web token - spring security

Chào anh em , mình đang được giao một bài tập với nội dung như ảnh

Bài toán :
IMG_20230620_151314_487

theo phân tích đề bài sẽ có ba yêu cầu chính gồm :
user a và và user b có cùng một role ( giả dụ là user_role ) tuy nhiên user a sẽ truy cập được chức năng còn user b thì không -> user a có một quyền lực mềm mà user b không có và chức năng ở đây sẽ được cho là api có tên /function trên postman

  • yêu cầu 1 : " lúc thì user a vào được user b thì không " -> user a có thể cấm user b truy cập chức năng
  • yêu cầu 2 : " cái này a a có thể tùy chỉnh config ngược lại " -> swap ( hoán đổi ) -> user a mất quyền truy cập chức năng và trao quyền đó cho user b
  • yêu cầu 3 : "lúc thì a config cả 2 đều vào được " -> public function api -> mọi người có thể truy cập api /function tự do ko phân biệt

tổng quát lại : 1. thì user a có quyền lực mềm hơn user b nên có quyền truy cập cũng như có thể config quyền bật / tắt , swap quyền vào api /function
2. user a có quyền tủy chỉnh hoạt động ở api tên /setting và hệ thống sẽ đọc value đặt sẵn trong key Accpet gửi về và xem đó là quyền gì rồi thao tác

image

Hiện tại mình đã sử dụng hai cách :

Cách 1 : user a ngoài user_role thì sẽ có thêm superUser_role để đánh dấu đây là người có quyền , còn user b thì chỉ có user_role mà thôi -> nghĩa là mỗi khi truy cập function thì sẽ check 2 lớp -> lớp đầu tiên là @PreAuthorize(“User”) -> lớp thứ hai là requestIsUserInRole(“SuperUser”) -> đáp ứng được 2 lớp bảo mật check role này sẽ có thể đi sâu vào việc setting hoặc truy cập chức năng

Cách 2 : tạo 2 bảng user trong mySQL , bảng user1 sẽ lưu toàn bộ tất cả user ko phân biệt gì hết , bản user2 sẽ chỉ lưu những user có quyền truy cập , tùy chỉnh và mỗi khi truy cập hoặc tùy chỉnh cứ lôi bảng user2 thông qua REPOSITORY ra mà check và thao tác

em đã làm hai cách này tuy nhiên người giao bài cho em vẫn không đồng ý với cả hai cách làm này của em , mọi người có thể chỉ ra cái sai của em được ko ạ ? hoặc đề bài em đọc ko hiểu kĩ có vấn đề gì đó ?

và đây là lớp websecurityConfig của mình
image
phải chăng mục đích của người giao bài là em phải config gì đó ở hàm SecurityFilterChain filterChain phải ko ạ ?

anh em có thắc mắc thêm gì về đoạn code thì cmt nhé , mình sẽ gửi đoạn code theo từng cách giải của mình

Sao cậu không hỏi thử người giao bài xem chính xác họ muốn gì? :smile:
Tớ thực ra chẳng hiểu ý của người này nữa :smile:

3 Likes

image

HUHU đây là bài tập chỗ mình đang thực tập và mình mắc kẹt bài này gần hai tháng rồi

mình không hiểu nổi ý người giao bài , anh ấy cứ úp mở làm mình không thể suy đoán được gì và mình không ko biết mình bị kém thông minh hay mình có vấn đề đọc hiểu mà sao mãi không làm đúng ý người giao bài huhu

mình đã làm rất nhiều cách từ

Cách 1 : user a ngoài user_role thì sẽ có thêm superUser_role để đánh dấu đây là người có quyền , còn user b thì chỉ có user_role mà thôi -> nghĩa là mỗi khi truy cập function thì sẽ check 2 lớp -> lớp đầu tiên là @PreAuthorize(“User”) -> lớp thứ hai là requestIsUserInRole(“SuperUser”) -> đáp ứng được 2 lớp bảo mật check role này sẽ có thể đi sâu vào việc setting hoặc truy cập chức năng

Cách 2 : tạo 2 bảng user trong mySQL , bảng user1 sẽ lưu toàn bộ tất cả user ko phân biệt gì hết , bản user2 sẽ chỉ lưu những user có quyền truy cập , tùy chỉnh và mỗi khi truy cập hoặc tùy chỉnh cứ lôi bảng user2 thông qua REPOSITORY ra mà check và thao tác

Cách 3 :
user a và và user b có cùng một role ( là user_role ) tuy nhiên user a sẽ truy cập được chức năng còn user b thì không -> user a có một quyền lực mềm mà user b không có và chức năng ở đây sẽ được cho là api có tên /function trên postman
và tất cả config trên database mà database ở đây lại là MYSQL SYNTAX , hãy vào trong file MYSQL_syntax vì bài toán này đang làm theo hướng đó

HUHU , ANH EM CỨU MÌNH VỚI , MÌNH KHẨN CẦU XIN ANH EM , MÌNH BIẾT MÌNH VIẾT RẤT DÀI DÒNG NHƯNG BÀI TOÁN VÀ NHỮNG GÌ MÌNH ĐÃ TRẢI QUA MÌNH KHÔNG THỂ VIẾT NGẮN ĐƯỢC , CẦU XIN ANH EM :((

đây là link github dự án mình đang làm , anh em cứ tập trung vào file security lớp websecurity và class testController -> và class TestController -> có getMapping ("/function")

HUHU , ANH EM CÓ THẮC MẮC GÌ Ở DƯỚI MÌNH SẼ REP ANH EM LUÔN , NẾU ANH EM NÀO GIÚP MÌNH HOÀN THÀNH ĐƯỢC BÀI TẬP NÀY MÌNH SẼ HẬU TẠ SỐ TIỀN HẬU HĨNH Ạ , MÌNH XIN CẢM ƠN ANH EM

Bài này thì chia kiểu permission based với từng chức năng. Nếu user chưa được gán quyền thì sẽ không dùng được chức năng là xong. Role rủng chỉ dùng để lấy quyền mặc định
Nếu muốn phức tạp hơn thì chia permission theo object level nữa
Khi truy cập chức năng thì lấy quyền của user theo chức năng đó. Nếu có quyền thì ok nếu không thì từ chối

1 Like

mình hiểu ý bạn , đó là theo bài toán lấy gốc là tất cả đều auto có quyền user_role xong tùy sau đó mà người có thêm quyền phụ để truy cập , ở vế hai cấp quyền phụ này mới là vấn đề chính

mình đã làm đủ mọi cách ở trên mà vẫn ko đáp ứng được đúng yêu cầu người giao bài HUHU T_T

từ cách tạo thêm cột function_name trong bảng user thì mỗi lần truy cập api chức năng xét hai lớp bảo mật là role và function_name cũng ko đc

rồi cách tạo hai bảng , user có quyền mềm thì có tên trong bảng 2 -> mỗi lần ai đó truy cập api chức năng thì cứ đem userRepository chứa users2 ra mà check cũng ko dc huhuhu

BẠN CỨU MÌNH VỚI T_T

Bỏ hai cách này đi, nên tránh các non-standard solution như thế này.

Cứ làm theo cách 1, vừa đơn giản vừa chạy được (tất nhiên chưa ok lắm nhưng idea là đúng). Còn “thằng” giao bài nếu bảo sai phải nói rõ sai chỗ nào, không đáp ứng yêu cầu gì,… và đưa keyword gợi ý, cho hướng giải,… Có khi “thằng” đấy còn chẳng biết thế nào là đúng đâu.

Ps: bạn thực tập đâu thế?

2 Likes

Sao suy nghĩ phức tạp thế. Biết đâu cái bạn đang nghĩ thực ra không phải cái mà người ra đề cần thì sao.
Nói đơn giản thì bài này cách giải quyết giống như trong thực tế thôi. Bạn quy các API cần kiểm soát thành các quyền tương ứng cần thiết để có thể sử dụng.
Muốn gán thêm quyền cho Role thì attach thêm quyền vào role đó, còn muốn gán riêng thêm quyền cho user thì attach thêm quyền vào user đó. Trường hợp muốn hủy quyền cụ thể của user thì attach quyền vào danh sách forbidden của user đó là xong.
Khi này quyền hạn của 1 user = quyền gán cho role + quyền gán cho user - quyền bị cấm
Với kiểu này thì bạn thích thêm hay bớt chức năng của 1 user thoải mái mà chẳng ảnh hưởng đến user khác nhưng lại không mất đi tính tổng quát của role. Trong TH muốn config 1 chức năng mà ai cũng dùng được thì xóa require permission đi là xong

PS: Bạn nên thúc đít người hướng dẫn bạn chứ để 2 tháng mà chưa xử lí được thì cũng nên xem lại người hướng dẫn

3 Likes

Sketch

bạn thử cách này được ko, roles - permissions n-n , users - roles-permissions n-n

lúc này lấy cặp khóa bên bảng kết hợp roles-permissions kết hơp với bảng users , tạo thành bảng users-roles-permissions

như vd của mình : có 2 user a,b , có 2 role r1,r2 , có 3 permission p1,p2,p3

user a có role r1, r2 , và ở role r1 thì có được permission p1,p2
user b có role r1, r2 , và ở role r1 thì chỉ có được permission p2

đáp ứng được 2 user cùng 1 role mà permission khác nhau
và xác định được 1 role sẽ có những permission gì

mình cũng có hỏi thì anh dạy mình trả lời 50 50 lắm ý , mình cũng kbt ntn vì chỉ có nhắn tin qua telegram thôi , ngồi xa nhau nên k gặp trực tiếp nch đc và môi trường ở cty chủ yếu chat qua telegram nên việc hầu như cả ngày k nch trực tiếp là bthg , hic

Tình hình thế nào rồi cậu? Cuối cùng cậu đã hiểu anh bạn kia nói gì chưa? :smile:

huhu giờ mình phải giải trình ý nghĩa , bản chất từng chi tiết một của cả hai cách , huhu mình làm mãi viết mãi ko đúng ý huhuhuhu , nhưng cũng nhờ các bạn ở trên mình cũng có cách dự phòng thêm là tạo thêm permissions cho ROLE

cảm ơn bạn rất nhiều , hiện tại mình đã hiểu nhuần về cách này rồi và nó cũng là cách đi dúng hướng nhất USER chứa ROLE và trong ROLE lại chauws PERMISSION

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?