我正在为非关键数据开发一个小型 REST 网络服务,主要由智能手机应用程序访问。为了限制用户对其个人数据的访问(授权不需要组或角色),我需要实现某种基本身份验证。
由于服务将通过 HTTP 访问,因此使用 HTTP-Authentification 似乎不是一个好主意,因为用户名和密码将在每个请求中以明文形式发送,并且需要存储在客户端设备上。
因此,我的想法是通过以下方式实现身份验证:
- 用户使用我的网络服务的登录方法通过他们的用户名/密码登录
- 此方法检查用户名/密码组合的有效性(基于包含加盐和散列密码的数据库)
- 如果登录成功,则将用户的id(数据库表的主键)作为属性存储在会话中
- 在以下请求中,此属性用于对用户进行身份验证
在代码中,我的登录方法如下所示:
User user = this.authentificate(username, password);
HttpSession session = request.getSession(true);
if (user != null)
session.setAttribute("UserId", user.getId());
else
session.invalidate();
之后,我将能够根据会话对用户进行身份验证:
int userId = (int) request.getSession().getAttribute("UserId");
User currentUser = getUserById(userId);
这种方法是否可以被视为“安全”(不可能进行简单的会话劫持 - 据我了解https://stackoverflow.com/a/5838191/232175,属性值不会离开服务器)?
有什么缺点或替代方案吗?