将登录限制为可调整角色集的最佳方法
Best way to restrict login to adjustable set of roles
我的要求是只允许某些用户角色登录。角色集可能会在运行时发生变化。
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
哪种实施最合适/最安全?
- 在调用
subject.login()
之前查找用户角色(Shiro 之外),如果没有角色被允许则引发 AuthenticationException
。
- 当用户具有允许的角色之一时,让 JdbcRealm 的 authenticationQuery 仅 return 密码(通过 SQL JOIN)。
- 登录用户,然后检查角色/权限,如果不允许,立即注销并提出
AuthenticationException
。
- 其他选项?
您可能需要在此处考虑用户行为。如果您的 webapp 使用户看起来无法注销,(恕我直言)用户要做的第一件事就是重试,第二件事是他们会致电服务台并尝试重置密码。
这取决于您的实际应用,(所以对此持保留态度)。我建议让用户登录然后阻止访问,例如显示带有(“您不得通过”警告)的 403 页面,或显示 404(这是 GitHub 所做的,因为它不会泄露存在有效页面的信息)。
这也简化了 Shiro 的实现,只需要一个 role/permission 作为你的路由。
我的要求是只允许某些用户角色登录。角色集可能会在运行时发生变化。
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
哪种实施最合适/最安全?
- 在调用
subject.login()
之前查找用户角色(Shiro 之外),如果没有角色被允许则引发AuthenticationException
。 - 当用户具有允许的角色之一时,让 JdbcRealm 的 authenticationQuery 仅 return 密码(通过 SQL JOIN)。
- 登录用户,然后检查角色/权限,如果不允许,立即注销并提出
AuthenticationException
。 - 其他选项?
您可能需要在此处考虑用户行为。如果您的 webapp 使用户看起来无法注销,(恕我直言)用户要做的第一件事就是重试,第二件事是他们会致电服务台并尝试重置密码。
这取决于您的实际应用,(所以对此持保留态度)。我建议让用户登录然后阻止访问,例如显示带有(“您不得通过”警告)的 403 页面,或显示 404(这是 GitHub 所做的,因为它不会泄露存在有效页面的信息)。
这也简化了 Shiro 的实现,只需要一个 role/permission 作为你的路由。