假设我正在运行一个多租户应用程序,它通过子域为每个组织提供自己的门户。
示例 -
orgA.application.com
orgB.application.com
每个子域都从我的PSQL数据库中的不同架构/租户读取,但在其他方面是相同的应用程序。
在我的ApplicationController
我将current_user
设为 -
def current_user
if session[:user_id]
@current_user ||= User.find_by_id(session[:user_id])
end
end
很少有像我这样的管理员/超级用户在每个子域上都有一个用户帐户。如果我与我的用户(orgA
)登录id = 22
,那么我的session
设置为user_id: 22
。
现在说我要切换到orgB
,我的用户ID为44
。如果我在orgB
中设置会话后登录orgA
,我是否有可能在22
orgB
上以current_user
为用户意外登录?
更重要的是,我正在尝试了解如何设置浏览器cookie会话。根据我的理解,它是在客户端浏览器中加密和缓存的变量哈希值。是每个子域设置的吗?或者特定站点的所有子域共享相同的缓存/会话cookie?
更重要的是,如何阻止会话的异花授粉,如上例所示?我的<?php
// connect to the database
include('connect-db.php');
// number of results to show per page
$per_page = 5;
// figure out the total pages in the database
if ($result = $mysqli->query("SELECT * FROM players ORDER BY id"))
{
if ($result->num_rows != 0)
{
$total_results = $result->num_rows;
// ceil() returns the next highest integer value by rounding up value if necessary
$total_pages = ceil($total_results / $per_page);
// check if the 'page' variable is set in the URL (ex: view-paginated.php?page=1)
if (isset($_GET['page']) && is_numeric($_GET['page']))
{
$show_page = $_GET['page'];
// make sure the $show_page value is valid
if ($show_page > 0 && $show_page <= $total_pages)
{
$start = ($show_page -1) * $per_page;
$end = $start + $per_page;
}
else
{
// error - show first set of results
$start = 0;
$end = $per_page;
}
}
else
{
// if page isn't set, show first set of results
$start = 0;
$end = $per_page;
}
// display pagination
echo "<p><a href='view.php'>View All</a> | <b>View Page:</b> ";
for ($i = 1; $i <= $total_pages; $i++)
{
if (isset($_GET['page']) && $_GET['page'] == $i)
{
echo $i . " ";
}
else
{
echo "<a href='view-paginated.php?page=$i'>$i</a> ";
}
}
echo "</p>";
// display data in table
echo "<table border='1' cellpadding='10'>";
echo "<tr> <th>ID</th> <th>First Name</th> <th>Last Name</th> <th></th> <th></th></tr>";
// loop through results of database query, displaying them in the table
for ($i = $start; $i < $end; $i++)
{
// make sure that PHP doesn't try to show results that don't exist
if ($i == $total_results) { break; }
// find specific row
$result->data_seek($i);
$row = $result->fetch_row();
// echo out the contents of each row into a table
echo "<tr>";
echo '<td>' . $row[0] . '</td>';
echo '<td>' . $row[1] . '</td>';
echo '<td>' . $row[2] . '</td>';
echo '<td><a href="records.php?id=' . $row[0] . '">Edit</a></td>';
echo '<td><a href="delete.php?id=' . $row[0] . '">Delete</a></td>';
echo "</tr>";
}
// close table>
echo "</table>";
}
else
{
echo "No results to display!";
}
}
// error with the query
else
{
echo "Error: " . $mysqli->error;
}
// close database connection
$mysqli->close();
?>
方法太基础了吗?
谢谢!
答案 0 :(得分:1)
你从根本上询问这里的cookie,答案相对简单:除非你明确要求,否则cookie不会在子域之间共享 。
当您发送Set-Cookie
HTTP标头以在用户的浏览器中创建Cookie时,您可以选择是否包含domain
配置选项。该选项控制cookie保存在哪个域并将被提供给。
默认情况下,如果您发送的Set-Cookie
没有domain
选项,则会为当前主机名设置,其中包含子域。也就是说,siteA.example.com
无法访问siteB.example.com
上设置的Cookie。
如果您在domain
上创建Cookie时发送example.com
siteA.example.com
个example.com
选项,则可以*.example.com
和Set-Cookie
访问该Cookie ,因此您的所有网站都可以访问它。
对于您的情况,您应该使用否 domain
选项发送A
标头。这是大多数设置中的默认设置including Rails,因此您不太可能需要做任何事情。