我希望有人可以帮我解决一个问题。
我有一个处理一般会话数据存储的Session对象,我还有一个验证用户凭据的Authentication对象。
最初,我将所需的Authentication类名称传递给Session对象,然后使用login方法创建Authentication对象的实例并验证凭据。我将此验证的结果存储在Session变量中,并通过getter使其可用。用户数据也存储在会话中供以后使用。除此之外,我还有一个注销方法,它从会话中删除用户数据,从而将用户注销。
我的问题是Session对象在登录其帐户的用户中应扮演什么角色?
还有什么其他方式可以建议我处理用户登录,因为它现在就是我觉得好像我在Session对象中被包含太多。
答案 0 :(得分:3)
会话是一个很好的地方,用于保存您希望在各种页面中以某种状态管理的用户数据,或者如果您需要一种快速可访问的方式来获取它而不需要访问数据库。在会话中保留安全信息(re:密码/等)是一个坏主意,但快速访问信息(如用户名,姓名,电子邮件地址,首选项等)都是放入会话的好数据。尽量保持简单。
请记住,会话(或相关的cookie)应该只用于识别。它不应该用于身份验证。
认证对象是一种很好的方法。确保它只在需要时保存安全信息,并且具有可用于保护敏感数据的所有必要功能。
答案 1 :(得分:3)
简单地调用您的身份验证方法应触发Auth
内的逻辑以在会话(或其他一些数据存储)中存储正确的数据,并且Auth
也应该专门用于检索/撤消此信息。因此,使用示例表示您的评论可能是:
class Auth {
public static function authenticate($identity, $pass)
{
// do lookup to match identity/pass if its good then
/* assume $auth is an array with the username/email or
whatever data you need to store as part of authentication */
Session::set('auth', $auth);
return true;
// if auth failed then
Session::set('auth', array('user'=>'anonymous'));
return false;
}
public function isAuthenticated()
{
$auth = Session::get('auth');
if(!$auth)
{
return false;
}
return (isset($auth['user']) && $auth['user'] !== 'anonymous');
}
}
[...]现在我感觉如此 虽然我被包裹得太多了 在我的Session对象中。
并且id同意。理想情况下,您只需要与身份验证/凭证进行交互,即可与Auth / Acl对象进行交互。然后他们会将会话用作有状态的商店...但你不应该关心它甚至存储在会话中。使用Auth / Acl对象的代码应该完全没有意识到这一事实。
例如:
//Bad
if($session->get('authenticated', 'auth'))
{
// do stuff
}
// also bad
if(isset($_SESSION['authenticated']))
{
// do stuff
}
//Good
if($auth->isAuthenticated())
{
// do stuff
}
// inside $auth class it might look like this
public function isAuthenticated()
{
$store = $this->getSotrage(); // assume this returns the $_SESSION['auth']
return isset($store['authenticated']);
}