将登录限制为可调整角色集的最佳方法

Best way to restrict login to adjustable set of roles

我的要求是只允许某些用户角色登录。角色集可能会在运行时发生变化。

UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);

哪种实施最合适/最安全?

  1. 在调用 subject.login() 之前查找用户角色(Shiro 之外),如果没有角色被允许则引发 AuthenticationException
  2. 当用户具有允许的角色之一时,让 JdbcRealm 的 authenticationQuery 仅 return 密码(通过 SQL JOIN)。
  3. 登录用户,然后检查角色/权限,如果不允许,立即注销并提出AuthenticationException
  4. 其他选项?

您可能需要在此处考虑用户行为。如果您的 webapp 使用户看起来无法注销,(恕我直言)用户要做的第一件事就是重试,第二件事是他们会致电服务台并尝试重置密码。

这取决于您的实际应用,(所以对此持保留态度)。我建议让用户登录然后阻止访问,例如显示带有(“您不得通过”警告)的 403 页面,或显示 404(这是 GitHub 所做的,因为它不会泄露存在有效页面的信息)。

这也简化了 Shiro 的实现,只需要一个 role/permission 作为你的路由。