Symfony2 跨多个应用程序共享用户

2024-03-17

我有多个 symfony2 应用程序,它们共享公共实体,但使用不同的数据库设置。每个数据库都有表user, user_role and role.

问题是:我希望该用户能够登录app1通过访问www.myproject.com/app1/login将 URL 更改为/app2/使用现有令牌ONLY如果相同的用户存在于app2的数据库(相同的用户名、密码和盐)。目前它仅检查相同的用户名,您必须同意,这非常不方便......

我实在看不出什么时候refreshUser()正在被调用...:-/

所有应用程序都使用相同的User and Role实体和UserRepository.

任何帮助将非常感激!

用户存储库:

class UserRepository extends EntityRepository implements \Symfony\Component\Security\Core\User\UserProviderInterface{
    /** @var User */
    private $user;

    public function loadUserByUsername($username) {
        /** @var $Q \Doctrine\ORM\Query */
        $Q = $this->getEntityManager()
        ->createQuery('SELECT u FROM CommonsBundle:User u WHERE u.username = :username')
        ->setParameters(array(
            'username' => $username
        ));
        $user = $Q->getOneOrNullResult();
        if ( $user == null ){
            throw new UsernameNotFoundException("");
        }
        return $this->user = $user;
    }

    public function refreshUser(UserInterface $user) {
        return $this->loadUserByUsername($user->getUsername());
    }

    public function supportsClass($class) {
        return $class === 'CommonsBundle\Entity\User';
    }

    public function findById($id){
        return $this->getEntityManager()
            ->createQuery('SELECT u FROM CommonsBundle:User u WHERE u.id = :id')
            ->setParameters(array(
            'id' => $id
            ))
            ->getOneOrNullResult();
    }
}

用户#等于(用户界面):

我知道有一种更漂亮的方法来编写这个方法,但我会在看到这个工作后重写它:)

public function equals(UserInterface $user)
{
    if (!$user instanceof User) {
          return false;
    }
    if ($this->password !== $user->getPassword()) {
          return false;
    }

    if ($this->getSalt() !== $user->getSalt()) {
          return false;
    }

    if ($this->username !== $user->getUsername()) {
          return false;
    }

    return true;

}


你的问题让我思考。使用 symfony2 安全性时,您遇到一个问题:要么会话有效(这意味着用户被验证为匿名用户或真实用户),要么会话无效。

因此,考虑到这一点,我认为您的方法无法按您希望的方式工作,因为假设 user1 登录并正在使用 app1。现在他切换到 app2 并且不在数据库中,这意味着他不应该具有访问权限。现在做什么?使会话无效?这意味着他必须在 app1 中再次登录。

如果您要使用子域,则可以将会话绑定到该子域,但这意味着用户必须为每个应用程序重新登录。

还有另一个问题:似乎 symfony2 将用户的 id 存储到会话中,因此如果无法访问 app1 数据库,您无法知道 app1 数据库中用户的密码和角色是什么,也无法检查它。

我想 symfony2 的安全性根本就不是为了这种行为而设计的。它期望会话与整个应用程序中的同一用户相关。

我不认为 symfony2 是这里的大问题但总体处理是用 php.让我们想一下如果没有 symfony2 我会建议什么:

当用户登录时,将用户和角色存储到会话中的特定数组中,例如:

user.app1 = array('username','password',array('role1','role2'))

现在,在对 app1 的每个请求中,我都会检查 user.app1 是否在会话中并从那里读取角色。如果没有,我会检查 user.app2、user.app3 等。如果找不到,请重定向到登录。如果找到一个,我将查询数据库以查找具有相同用户名的用户并比较其他值。如果匹配,则将所有内容存储到数据库中。如果没有,请检查会话中的下一个用户。

我查了一下 symfony安全参考 http://symfony.com/doc/current/reference/configuration/security.html,并且您有一些扩展点,所以也许您可以从那里开始工作。这form_login got a success_handler,因此应按照上面的建议将数组添加到会话中。防火墙本身有一些参数,例如request_matcher and entry_point它可以用来添加额外的检查,就像我上面提到的那样。所有这些都被定义为服务,因此注入实体管理器和安全上下文应该没有问题。

我个人认为这里的设计本身并不是最佳的,您可能最好重构代码以将一个用户用于所有应用程序和不同的角色(请记住您可以定义许多实体管理器并使用不同的数据库),甚至整合所有数据库和将所有内容存储到一个数据库中,使用 acl 来防止用户查看“错误”内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony2 跨多个应用程序共享用户 的相关文章

  • Symfony:为什么 isInitialized 总是 false?

    我用教义查询了一个用户 customer this gt getDoctrine gt getRepository DemoUserBundle Customer gt find 1 但我得到了结果 顾客 1441 已初始化 错误的 ID
  • Symfony StreamedResponse 服务器发送事件阻止请求

    我在 Symfony 中使用 StreamedResponse 实现了服务器发送事件 SSE 因此 当事件发生时 会话中会保存一条消息 该消息将通知给用户 问题是 当执行包含客户端代码的页面时 它会阻止对应用程序的所有 Web 请求 直到
  • PHP:会话 |无法解码会话对象

    我尝试将电子商务功能添加到遗留项目中 因此我仍然需要旧的会话处理程序 我使用 PHP v7 1 14 和 Session2DB https github com voku session2db tree 4 0 0 https github
  • 配置 KnpPaginator 以与 Twitter Bootstrap 配合使用

    i m trying to apply twitter bootstrap css style to my knp pagination without modifying the vendor Is there a way to conf
  • Twig:如何获取字符串中的第一个字符

    我正在实施按字母顺序搜索 我们显示一个名称表 我只想突出显示那些名称以相应字母开头的字母 我被一个简单的问题难住了 如何读取 twig 中字符串 user name 的第一个字符 我尝试了多种策略 包括 0 操作 但它抛出异常 这是代码 f
  • 如何使用express在node.js中使浏览器关闭后会话过期?

    我在用 req session cookie maxAge 14 24 3600 1000 0 让会话在两周后过期 但现在我想让它在浏览器关闭后过期 有什么办法可以做到吗 来自连接会话中间件文档 https github com expre
  • 如何在 Symfony 4 中为测试环境设置数据库

    我对如何在 symfony 4 中为测试环境设置数据库感到困惑 我曾经在配置测试 ymlsymfony 3 及以下版本中的文件 最佳做法是什么 我应该重新创建一个学说 yaml文件输入配置 包 测试 该文档提到如何通过编辑 phpunit
  • 在会话 cookie 中存储大量数据会产生什么影响?

    谁能解释一下在会话中存储大量数据的缺点或给我指出一些阅读材料 我也很感兴趣在会话中存储数据和从数据文件读取数据之间是否有任何区别 如果您在会话中存储大量数据 则输入 输出性能会下降 因为会有大量读取 写入 默认情况下 PHP 中的会话存储在
  • session_regenerate_id 没有创建新的会话 id

    我有一个脚本 旨在完成当前会话并开始新的会话 我使用了一段代码 它在我的开发计算机上运行良好 但是 当我将其发布到生产服务器时 会话 ID 始终保持不变 以下是我重新启动会话的代码 session start SESSION array P
  • 运行 Composer 返回:“无法打开输入文件:composer.phar”

    我是 symfony2 和阅读新手symblog http tutorial symblog co uk tutorial parts 在第三章中 在尝试使用数据装置时 我尝试了以下命令 php composer phar update 但
  • Azure 上的“phpcomposer.phar install”出现“无法终止进程”错误

    我正在尝试将我的 Symfony 2 应用程序部署到 Microsoft Azure 网站云 为此 我按照本指南中的步骤操作http symfony com doc current cookbook deployment azure web
  • 服务器上的 Rails 会话

    我想让一些 Rails 应用程序在不同的服务器上共享同一个会话 我可以在同一服务器内完成此操作 但不知道是否可以在不同服务器上共享 有人已经做过或者知道怎么做吗 Thanks Use the 数据库会话存储 https github com
  • Symfony2 自定义密码编码器(bcrypt)

    我已经编写了自己的密码编码器 它实现了PasswordEncoderInterface class BCryptPasswordEncoder implements PasswordEncoderInterface protected en
  • 具有数据库连接依赖性的自定义约束验证器 Symfony2

    我正在向 Symfony2 项目添加自定义验证查询 The docs http symfony com doc current cookbook validation custom constraint html缺乏完整的示例 并且我不确定
  • ASP.NET:如何删除所有用户的所有会话变量?

    我们有 ASP NET 应用程序 想要删除所有用户的所有会话中的所有会话变量 我的意思是不要仅使用以下命令从当前会话中删除会话变量 Session Clear or Session Abandon 我们还需要清除其他用户会话中的会话变量吗
  • Symfony2 - 将 Swiftmailer 添加为服务

    我想将我的电子邮件代码从我的控制器移至服务中 到目前为止我已完成以下操作 在 services yml 中创建条目 在 acme demobundle services EmailManager php 中创建了一个 EmailManage
  • Symfony 2:如果用户具有特定角色,则将用户重定向到页面

    我有一个小问题 我希望无论用户在我的网站上哪里 如果他具有 ROLE DEGRADE 角色 他就会被重定向到特定页面 我该怎么做 我必须使用防火墙 我不想将用户重定向到表单登录 而只是重定向到一个简单的页面 我希望在我的网站上随处可见 而不
  • MVP - 演示者应该使用 Session 吗?

    我正在为网页使用模型 视图 演示者模式 演示者应该知道会话还是应该只有视图知道它 我想我的意思是像会话这样的概念与视图的体系结构非常相关 所以它们应该仅限于视图使用吗 否则 如果我想在不同架构的类似页面上重用演示者 会发生什么 或者我不需要
  • ASP.Net 中的 Session.Abandon() 和 Session.Clear() 有什么区别?

    有什么区别Session Abandon and Session Clear 在 ASP Net 中 Session Abandon 将结束当前会话 Session End将被解雇 下一个请求将激发Session Start event S
  • Node + Express 会话过期?

    我有一个 Express 应用程序 并且有一个登录表单 我需要持续 1 个月的会话 我是否将 maxAge 设置为一个月 以毫秒为单位 我让两台计算机保持打开状态并登录了 24 小时 当我回来时 两台计算机都已注销 我该如何解决这个问题 实

随机推荐

  • 如何使用 Composer 初始化 Symfony 控制台项目,以限制其坚持使用长期发行版本?

    我的目标是经营作曲家require命令来初始化 Symfony Console 项目 当运行作曲家的require命令 我相信可以将所需的包限制为特定版本 我正在考虑使用它来坚持 Symfony 的长期发行版本 它将支持更长时间 根据Sym
  • ExtJS 4:单击按钮后替换视口项目数组中的两个组件

    下面是一些单击按钮后即可运行的代码 当我在另一个按钮中再次设置 视图 变量 对于不同的按钮 并使用不同的网格和不同的表单运行这个确切的代码时 这两个项目完全消失 为什么它在第一次迭代时运行 但在第二次迭代时不运行 更重要的是 我怎样才能正确
  • 按元素有效比较 numpy 数组与其自身

    我正在执行大量这些计算 A A np newaxis T 其中 A 是一个密集的 numpy 数组 通常具有共同的值 为了进行基准测试 我们可以使用 n 30000 A np random randint 0 1000 n A A np n
  • Angular 2 服务 + RxJS BehaviourSubject 或 EventEmitter

    我是 Angular 2 和 RXJS 的新手 我有一个带有 2 个触发器 按钮 的自定义标头组件 它应该在应用程序的不同部分激活 2 个不同的导航指令 我创建了一个服务 它注册了 2 个不同的导航指令 并且标头组件订阅了该指令 我想知道链
  • 类型错误:get_params() 缺少 1 个必需的位置参数:'self'

    我试图使用scikit learn与 python 3 4 一起打包以进行网格搜索 from sklearn feature extraction text import TfidfVectorizer from sklearn linea
  • 即使添加“unsafe-eval”后,对 function() 的调用也会被 CSP 阻止

    我正在开发一个 NodeJS 项目并且正在使用CSP 内容安全政策 http www w3 org TR CSP 我正在使用外部插件FullCalendar它被 csp 阻止 出现以下错误 Error call to Function bl
  • Sequelize:批量插入

    我正在使用 Node js MySQL 和 Sequelize 我想一次向表中插入一些 10k 行 桌子有定制的primaryKey字段 正在手动设置 数据是从网上下载的并且是重叠的 我想要一个版本bulkCreate如果数据中的任何行具有
  • 如何在 MPAndroidChart 中向 x 轴和 y 轴添加字符串标签

    I am trying to add a String Label in order to label both the domain x axis and the range y axis of my LineChart as shown
  • Django:GenericForeignKey 中的 content_type_id

    我根据文档编写了这个类 以便能够对应用程序中具有 id 的任何内容进行投票 class Vote models Model class Meta unique together voted id voter id content type
  • take 2 $ [1..] 在 haskell 中如何工作?

    我们知道 运算符绑定的是最松散的 并且也关联到右侧 这意味着 1 应该首先被评估 因此 它不应该陷入无限循环吗 为什么它甚至完全停止了 Haskell is lazy and doesn t change that The operator
  • 适用于 C++ 的最佳开放式 XML 解析器是什么? [复制]

    这个问题在这里已经有答案了 我正在寻找一个简单 干净 正确的 XML 解析器来在我的 C 项目中使用 我应该自己写吗 怎么样RapidXML http rapidxml sourceforge net RapidXML 是一个用 C 编写的
  • C++:全局变量作为指针

    我是 C 新手 对全局变量有一个问题 我在许多示例中看 到全局变量是带有堆地址的指针 所以指针位于全局 静态变量的内存中 地址后面的数据位于堆上 对吗 相反 您可以声明存储数据的全局 无指针 变量 因此 数据存储在全局 静态变量的内存中 而
  • Grails - 将 HTML 文件作为 UTF-8 提供?

    通过 tomcat 通过 web app 提供的 html 文件的 UTF 8 被破坏 如果我直接打开文件file 它渲染得很好 如果我在运行应用程序期间查看该文件 它看起来不错 然而 当我部署为战争时 UTF 8字符出现乱码 响应的内容类
  • 如何内省地将处理程序连接到信号?

    gtk Builder http www pygtk org docs pygtk class gtkbuilder html能够识别 GUI 在 XML 文件中描述 可以发出的所有信号 并使用以下方法连接信号 http www pygtk
  • 状态栏中图标的颜色(Flutter)

    我正在使用 FLUTTER 设计指的是状态栏的黑色 并且状态栏图标的颜色必须是白色 那么如何改变 flutter 中状态栏图标的颜色呢 要改变icon白色尝试以下内容build method import package flutter s
  • 在 Rails 中清理迁移的好方法是什么?

    所以我已经在这个 Web 应用程序上工作了一年 我想将模式编译为一个迁移 这样我的文本编辑器加载速度更快 git 工作目录也不会那么混乱 搜索查找会更快 我的任何配置 数据库都不会长 4000px 迁移服务器后 请删除迁移文件 如果您想开始
  • CSV 标准 - 多个表

    我正在开发一个 python 项目 对 csv 文件进行一些分析 我知道 csv 文件没有明确定义的标准 但据我了解定义 https www rfc editor org rfc rfc4180 page 2 https www rfc e
  • 以编程方式控制 Angular-ui 手风琴的好方法是什么?

    我正在使用手风琴指令http angular ui github com bootstrap http angular ui github com bootstrap 我需要更好地控制手风琴何时打开和关闭 更准确地说 我需要手风琴组内的一个
  • ggplot2:如何通过多个变量为图表着色

    我相当确定我在某处看到了这个问题的解决方案 但由于我无法找到它 这就是我的问题 我有一些由多个变量标识的时间序列数据 我希望能够使用多个变量来绘制图表并区分颜色ggplot2 样本数据 date lt c 2016 04 01 UTC 20
  • Symfony2 跨多个应用程序共享用户

    我有多个 symfony2 应用程序 它们共享公共实体 但使用不同的数据库设置 每个数据库都有表user user role and role 问题是 我希望该用户能够登录app1通过访问www myproject com app1 log