- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由不同用户使用的网络应用程序。我需要做的是避免同一用户登录不同的浏览器或系统。有人可以帮忙吗???提前致谢。
最佳答案
很多答案(即“已登录标志”)都有一个相当大的问题!如果浏览器出现问题怎么办? (机器被格式化,缓存/cookies被清除,等等)然后你就有了一个服务器认为已经登录的用户,但就用户而言还没有......并且将无法登录您必须添加超时,并监视每个请求(以重置超时)。
我建议您在用户每次登录时向他们颁发新的凭据。颁发新凭据的行为会使之前的凭据失效。最简单的方法是创建一个(随机) token 并将该 token 保存到 cookie 和数据库行中。根据数据库值检查 cookie 并确保它是最新的。
请注意,这与其他答案相反(我不清楚这是否与您的意图相反)——不会阻止用户再次登录,但他以前的登录被禁用。
编辑:
我在伪代码中所说的内容:
//to authenticate user
if ($user = sql('select * from users where id = ' . intval($_COOKIE['user_id']) && $_COOKIE['token'] == $user['token']) {
//user is authenticated. the token in their cookie is the same as the token in the db
} else {
//user is not authenticated.
}
//to log user in
if ($user = sql('select * from users where = ' . intval($_REQUEST['user_id']) && $user['password'] == $_REQUEST['password']) {
//user is authenticated and can be logged in now. the user id they passed and password match (though you'll probably be accepting email address and hasing the password...).
$token = rand();
setcookie('user_id', $user['user_id']);
setcookie('token', $token);
sql('update users set token = '$token' where user_id = ' . $user['user_id']);
//now the token in the db has been updated, and only the user that just logged in has it. other instances of this users login don't have it, so can't authenticate
} else {
//user is not authenticated and can't be logged in
}
尽管该代码比伪代码更像 PHP,但它并不意味着按原样运行。 您需要自定义您的数据库库、表架构,确保安全性(通过对密码使用 md5() 等)。我只是想说明这个概念。
编辑:如上所述,此方法的要点是允许用户再次登录,但使之前的登录无效。 (这与不允许用户第二次登录相反。)无论哪种方式,用户都只登录一次 - 问题是您允许第一次还是最后一次。但是,从您现在的评论来看,这似乎不是您(认为)想要的。
尝试阻止用户再次登录充满了陷阱。从最简单的设置开始,用户登录,您在数据库中设置一个“isLoggedIn”值,然后您不允许他们再次登录,直到该值被清除(可能是从您的 logout.php 中清除)。 (这是其他人的建议 - 继续标记他们的答案之一。)如果他们无法注销,您会怎么做?如果他们从桌面登录然后需要从办公室登录?
您是否禁止他们登录?或者,您可能会显示“您确定要登录吗”消息,并允许他们覆盖之前的登录信息。如果是这样,您需要一种方法来使之前的登录无效。所以你又回到了我的 token 建议。 (在这种情况下,使用数据库中 token 的存在来表示他们仍然登录到以前的 session (相当于 isLoggedIn),并在他们注销时将其清除。)
您仍想阻止第二次登录吗?那么您就不能依赖您的用户主动注销。如果他们在办公室怎么办?或者他们从手机登录然后丢失了手机?或者清除他们的cookie。你必须依靠超时。不要设置得太长,否则用户到达办公室时无法登录,也不要设置得太短,否则用户每次喝咖啡都必须登录。 ( session cookies 可能对她有帮助,但你不能依赖它们,因为许多人让浏览器窗口打开好几天。)
在这种情况下,每次他们登录时点击页面,您都会更新数据库中的lastActivity。然后检查lastActivity >= now() - x 分钟。如果没有,那么您将其注销。当他们尝试登录时,您必须执行相同的操作。如果 lastActivity >= now() - x 分钟,您就告诉他们无法登录。
(您可以依赖 PHP session ,但我必须承认我在配置这些 session 方面没有足够的经验来推荐任何内容。我寻找一个在 session 过期时插入的处理程序,但我没有找到任何东西这看起来很简单,可能是因为 session 可能会在下次调用 PHP 页面前几天过期。)
关于php - 避免用户在不同的浏览器或系统中登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14037071/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!