Để trả lời câu hỏi đầu tiên của bạn, vấn đề lớn nhất khi kiểm tra xem người dùng có vai trò nào hơn là một quyền cụ thể, đó là quyền có thể được giữ bởi nhiều vai trò. Để làm ví dụ cho điều này, một nhà phát triển có thể có quyền truy cập để xem cổng thông tin của nhà phát triển trên mạng nội bộ của công ty, đây có lẽ cũng là một sự cho phép của người quản lý của họ. Nếu người dùng đang cố truy cập vào cổng thông tin của nhà phát triển, bạn sẽ có một kiểm tra tương tự như:
if(SecurityUtils.hasRole(developer)) {
// Grant them access to a feature
} else if(SecurityUtils.hasRole(manager)) {
// Grant them access to a feature
} else if...
(Một switch
tuyên bố trong ngôn ngữ bạn chọn sẽ tốt hơn, nhưng vẫn không đặc biệt gọn gàng)
Quyền càng phổ biến hoặc được tổ chức rộng rãi, bạn càng cần kiểm tra nhiều vai trò người dùng hơn để đảm bảo rằng ai đó có thể truy cập vào một hệ thống nhất định. Điều này cũng sẽ dẫn đến một vấn đề là mỗi khi bạn sửa đổi quyền cho một vai trò, bạn sẽ cần sửa đổi kiểm tra để phản ánh điều này. Trong một hệ thống lớn, điều này sẽ trở nên rất khó sử dụng rất nhanh.
Nếu bạn chỉ cần kiểm tra xem người dùng có quyền cho phép họ truy cập vào cổng nhà phát triển hay không, thì họ không có vai trò gì, họ sẽ được cấp quyền truy cập.
Để trả lời câu hỏi thứ hai của bạn, lý do bạn có vai trò là vì chúng hoạt động dễ dàng sửa đổi và phân phối "gói" quyền. Nếu bạn có một hệ thống có hàng trăm vai trò và hàng ngàn quyền, việc thêm người dùng mới (ví dụ: người quản lý nhân sự mới) sẽ yêu cầu bạn thực hiện và cấp cho họ mọi quyền mà người quản lý nhân sự khác nắm giữ. Điều này không chỉ tẻ nhạt, mà còn dễ bị sai lầm nếu được thực hiện thủ công. So sánh điều này với việc chỉ cần thêm vai trò "người quản lý nhân sự" vào hồ sơ của người dùng, điều này sẽ cấp cho họ quyền truy cập giống như mọi người dùng khác có vai trò đó.
Bạn có thể lập luận rằng bạn có thể chỉ cần sao chép một người dùng hiện tại (nếu hệ thống của bạn hỗ trợ điều này), nhưng trong khi điều này cấp cho người dùng quyền chính xác tại thời điểm đó, thì việc cố gắng thêm hoặc xóa quyền cho tất cả người dùng trong tương lai có thể khó khăn. Một kịch bản ví dụ cho điều này là nếu có thể trong quá khứ, nhân viên nhân sự cũng chịu trách nhiệm về biên chế, nhưng sau đó, công ty đủ lớn để thuê nhân viên đặc biệt để xử lý bảng lương. Điều này có nghĩa là HR không còn cần phải truy cập vào hệ thống bảng lương, do đó có thể xóa quyền. Nếu bạn có 10 thành viên nhân sự khác nhau, bạn sẽ cần phải thực hiện thủ công và đảm bảo bạn xóa quyền chính xác dẫn đến khả năng xảy ra lỗi người dùng. Vấn đề khác với điều này là nó đơn giản là không có quy mô; khi bạn có được càng nhiều người dùng trong một vai trò nhất định, điều đó làm cho việc sửa đổi vai trò trở nên khó khăn hơn nhiều. So sánh điều này với việc sử dụng các vai trò, trong đó bạn chỉ cần sửa đổi vai trò bao quát trong câu hỏi để loại bỏ quyền, điều này sẽ được phản ánh bởi mọi người dùng giữ vai trò đó.