在模型 - 视图 - 控制器方式中编写身份验证库时,最好和最安全的方法是什么?
让我困难的事情是跟踪用户活动并通过cookie记住用户或在数据库中存储会话?
提前致谢 :).
我使用基于SESSION变量的简单登录系统.用户登录后,会设置会话变量,告诉我的脚本要接受用户.我不使用任何自定义客户端cookie变量.
我想在登录屏幕上提供"让我记录一整天"的选项.如何以安全的方式做到这一点?
对于我最新的项目,我使用的是https://github.com/hassox/rails_warden.它非常适合我的需求,除了我找不到实现remember_me的好方法.我知道从安全的角度来看,记住这一点是非常困难的,所以我希望有一个能够完成工作的项目.有人见过什么或得到一个好主意?
我在Play的第一个网站上工作!框架,有时我在用户登录时调用此方法:
static void connect(User user){
session.put("userid", user.id);
}
Run Code Online (Sandbox Code Playgroud)
只需将用户ID存储在会话中,我就可以检查它是否在每个请求中设置,工作正常.问题是,一旦浏览器关闭,cookie就会丢失,用户需要再次登录.我想创建一个"记住我"选项,似乎唯一的方法是创建一个cookie并将其与响应一起发送,如下所示:
response.setCookie("user", userdata, "14d");
Run Code Online (Sandbox Code Playgroud)
所以我想知道,创建一个会话有什么意义,当它做同样的事情时?(但不会让我对cookie时间有任何控制权).而我还没有发现的另一件事是如何从请求中读取cookie?
(而且我知道用setCookie创建的cookie没有加密,我需要调用Crypto.sign())
我无法理解Michael Hartl在Ruby on Rails教程中对"记住我"的实现.他使用登录方法创建了一个SessionsHelper模块,其中包含以下内容:
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
return @current_user ||= user_from_remember_token
end
private
def user_from_remember_token
#passes array of length two as a parameter -- first slot contains ID,
#second contains SALT for encryption
User.authenticate_with_salt(*remember_token)
end
def remember_token
#ensures return of a double array in the event that
#cookies.signed[:remember_token] is nil.
cookies.signed[:remember_token] || [nil,nil]
end
end
Run Code Online (Sandbox Code Playgroud)
注意: User模型中的authenticate_with_salt 方法通过第一个参数(id)查找用户,如果用户已定义且其salt等于第二个参数(salt),则返回用户,否则返回nil.
我无法理解为什么我们会花这么长时间来测试用户是否已经登录:
如果用户已登录,@current_user …
使用"正常" - 而非"记住我"身份验证 - 我可以设置成功和失败处理程序,将其添加到security.yml文件中:
form_login:
# ...
success_handler: authentication_handler
failure_handler: authentication_handler
Run Code Online (Sandbox Code Playgroud)
但是,当用户的会话过期并且使用"记住我"cookie再次进行重新认证时,我无法找到一种方法来监听"记住我"的重新认证.有关如何实现这一目标的任何想法?
我正在使用ASP.NET MVC 4中的标准成员资格功能.
我有一个登录表单,当用户成功登录时,会从数据库中检索一些用户信息并将其放入我在应用程序的某些部分使用的Session变量中.
我的问题如下:
当我激活"记住我"选项时,它工作正常,但是永远不会加载会话变量,因为在登录验证过程中实际上正在加载该变量,现在正在跳过该过程.
我的问题是:有没有办法抓住"记住我"验证过程来放置我的自定义代码,它将加载我需要的会话变量?(或者可能在"记住我"的cookie中添加更多信息,以后可以使用?)
谢谢
假设我有一个这样的登录表单:
<form>
<input type="email">
<input type="password">
</form>
Run Code Online (Sandbox Code Playgroud)
谷歌浏览器(和其他浏览器)能够提供保存我的电子邮件和密码,没有任何问题.此外,Chrome 在页面加载时自动填充此类表单,没有任何问题.
我需要开发一个功能,通过localstorage"记住"最后一个用户,并显示一些花哨的UI,其中还包括他们的姓名和电子邮件,这次只询问密码:
<div>Welcome our old customer Umut (remembered@email.com)</div>
<form>
<input type="hidden" value="remembered@email.com">
<input type="password">
</form>
Run Code Online (Sandbox Code Playgroud)
这次,Chrome不会在页面加载时自动填充密码,但当用户专注于此字段时,他们会先选择用户:
我想知道,如果有办法告诉浏览器,我已经选择了一封电子邮件,并且我想要在页面加载时自动填写该电子邮件的密码.
如果可能,跨浏览器.
PS.如果我不使用hidden的电子邮件类型,而不是只(使用显示:无),使其不可见的用户,Chrome的自动填充这两个电子邮件地址和密码.这意味着,一个不可见的电子邮件文件被Google Chrome"记住"的价值所覆盖.因此,即使您看到remembered@email.com精美的自定义设计,Chrome也会修改电子邮件和密码.
当我rememberMe在Hybris中激活(spring security)时,我希望rememberMe用户的行为类似于Hard Login用户.我的意思是,我希望那些rememberMe用户(软登录)不会遇到任何障碍,比如他们想要在结账过程中进行或类似的事情.如何在SAP Hybris平台中实现这一目标?
我正在尝试为我的ZF2 v2.2站点实现记忆功能.所以这就是我到目前为止所做的:我为会话管理器创建了一个服务,将会话写入db:
'session' => array(
'remember_me_seconds' => 2419200,
'use_cookies' => true,
'cookie_httponly' => true,
),
'session_manager' => function (ServiceManager $sm) {
$adapter = $sm->get('db_adapter');
$config = $sm->get('app_config');
$sessionOptions = new Session\SaveHandler\DbTableGatewayOptions();
$sessionTableGateway = new TableGateway('tbl_session', $adapter);
$saveHandler = new Session\SaveHandler\DbTableGateway($sessionTableGateway, $sessionOptions);
$sessionConfig = new Session\Config\SessionConfig();
$sessionConfig->setCookieDomain(ACTIVE_SITE);
$sessionConfig->setCookieSecure(true);
$sessionConfig->setOptions($config['session']);
$sessionManager = new Session\SessionManager($sessionConfig, NULL, $saveHandler);
$sessionManager->start();
return $sessionManager;
},
Run Code Online (Sandbox Code Playgroud)
并将此会话管理器用于我的会话并AuthenticationService:
Session\Container::setDefaultManager($sm->get('session_manager'));
'user_auth_service' => function (ServiceManager $sm) {
$authService = new \Zend\Authentication\AuthenticationService();
$session = new \Zend\Authentication\Storage\Session(null, null, $sm->get('session_manager'));
$authService->setStorage($session);
return …Run Code Online (Sandbox Code Playgroud) remember-me ×10
cookies ×2
php ×2
session ×2
hybris ×1
java ×1
javascript ×1
login ×1
login-script ×1
ruby ×1
symfony ×1
warden ×1