我试图结合FOSUserBundle和HWIOAuthBundle之后的文章,如https://gist.github.com/danvbe/4476697.但是,我不希望自动注册OAuth2经过身份验证的新用户:应由用户提供其他信息.
期望的结果
我想为注册用户提供以下信息:
现在,当用户通过Facebook进行身份验证并且用户尚不存在时,我希望注册表单填写缺失的信息(显示名称和个人资料图片).只有在此之后,才应创建新的FOSUser.在大多数教程中,个人资料图片和电子邮件地址等字段会自动填充Facebook信息.这并不总是令人满意也不可能.
此外,在创建用户之前,请考虑接受协议条款和您希望显示的规则.
可能的方法
我认为,解决方案是创建一种新的AnonymousToken,即OAuthenticatedToken,它保存相关的OAuth2信息但不计入身份验证.然后,使所有页面检查此类身份验证,并让其他页面重定向到OAuth-registration-page.然而,这对我来说似乎是一个不必要的复杂解决方案.
另一个解决方案可能是从头开始编写代码,而不是使用提到的两个bundle.我真的希望这不是必要的.
问:如何在登录流程的其余部分插入注册完成代码?
(我很想分享一些代码,但由于这是我需要帮助的概念,我没有太多要展示的.)
编辑:解决方案
继Derick的adivce之后,我得到了这样的基础知识:
自定义用户提供程序保存信息(遗憾的是,无法访问原始令牌,因此我无法在注册后登录用户):
class UserProvider extends FOSUBUserProvider {
protected $session;
public function __construct(Session $session, UserManagerInterface $userManager, array $properties) {
$this->session = $session;
parent::__construct( $userManager, $properties );
}
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
try {
return parent::loadUserByOAuthUserResponse($response);
}
catch ( AccountNotLinkedException $e ) {
$this->session->set( 'oauth.resource', $response->getResourceOwner()->getName() );
$this->session->set( 'oauth.id', $response->getResponse()['id'] );
throw $e;
}
}
}
Run Code Online (Sandbox Code Playgroud)
定制失败处理程序
<?php
// OAuthFailureHandler.php
class OAuthFailureHandler …Run Code Online (Sandbox Code Playgroud) 我开始实现HWIOAuthBundle并希望创建自己的自定义资源所有者.但是我不清楚文件/目录结构.
我需要在哪里放置文件以利用捆绑包?
注意:问题在本文末尾,但我将详细解释所有上下文以便更好地理解.
我正在开发一个由3个模块组成的Symfony2应用程序:
- 学生模块 - >需要角色ROLE_STUDENT
- 教师模块 - >需要角色ROLE_TEACHER
- 管理员模块 - >需要角色ROLE_ADMIN
该角色的层次结构如下:
- ROLE_TEACHER:[ROLE_STUDENT]
- ROLE_ADMIN:[ROLE_TEACHER]
因此:
学生(具有ROLE_STUDENT角色)只能访问他/她模块的所有页面,例如:
教师(具有ROLE_TEACHER角色)可以访问学生模块的所有页面和教师模块的所有页面,例如:
管理员(具有ROLE_ADMIN角色)可以访问学生模块的所有页面,教师模块的所有页面和管理员后端.
系统使用OAuth使用捆绑包HWIOAuthBundle(使用提供捆绑包的 OAuthUserProvider用户提供程序)通过Twitter对学生和教师进行身份验证.
我已成功验证用户身份,但默认情况下,所有用户都会自动使用以下角色进行身份验证: [ROLE_USER,ROLE_OAUTH_USER]
使用OAuth登录的步骤:
用户登录系统并自动:
如果数据库中不存在该用户:
- 将昵称保存在数据库的users表中.
- 在数据库的users表中保存角色ROLE_STUDENT(这是我默认的角色).
- 使用OAuth在系统中进行身份验证,但使用ROLE_STUDENT角色.如果用户存在于数据库中:
- 检查数据库中用户关联的角色.
- 使用OAuth在系统中验证用户,但使用数据库中关联的角色(即:ROLE_STUDENT或ROLE_TEACHER).
管理员(来自管理后端)可以查看昵称列表(由Twitter使用但保存在数据库中)以及每个昵称的已分配角色.管理员应该能够在ROLE_STUDENT和ROLE_TEACHER之间更改用户的角色.
我如何通过OAuth(HWIOAuthBundle)以默认角色(ROLE_STUDENT,如上所述)通过OAuth(HWIOAuthBundle)进行身份验证?
如果数据库中存在具有关联角色的昵称(ROLE_STUDENT或ROLE_TEACHER),我如何通过OAuth(HWIOAuthBundle)验证用户,但使用从数据库加载的角色?
我一直在阅读很多关于这个主题的内容,但我是Symfony2的新手,我不知道什么是解决它的最佳和最简单的方法.
先感谢您!
PS:如果您对任何事情有任何疑问或疑问,我将很乐意尽可能地解释.
尝试连接facebook HWI/OAuthBundle,遵循HWI/OauthBundle Doc中的所有步骤,但它返回错误
用户"HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUser"没有用户提供程序
有谁能解释为什么会发生这种情况以及如何解决这个问题?
我想在Symfony 3.0项目中安装HWIOAuthBundle.似乎存在对依赖性的限制,而HWIOAuthBundle 0.4仅适用于Symfony 3.0的早期版本.
是否有任何0.5版本的HWIOAuthBundle滚动或我是否必须用旧版本替换symfony 3.0才能使其正常工作?
我收到此错误消息:
$ composer require hwi/oauth-bundle
Using version ^0.4.0 for hwi/oauth-bundle
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for hwi/oauth-bundle ^0.4.0 -> satisfiable by hwi/oauth-bundle[0.4.0].
- Conclusion: remove symfony/symfony v3.0.0
- Conclusion: don't install symfony/symfony v3.0.0
- hwi/oauth-bundle 0.4.0 requires symfony/options-resolver ~2.3 -> satisfiable by symfony/options-resolver[v2.3.0, v2.3.1, v2.3.10, v2.3.11, v2.3.12, v2.3.13, …Run Code Online (Sandbox Code Playgroud) 正如标题所示,我将使用Facebook,Google和GitHub身份验证以及JWT身份验证器(LexikJWT).
在开始之前,我想知道如何使用它们?是否可以使用它们来保护API?
如果是,我的安全性应该具有哪种配置?假设我正在使用默认配置.
这是当前的security.yml:
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
acl:
connection: default
access_decision_manager:
strategy: affirmative
role_hierarchy:
ROLE_SALES_NOTIFICATIONS: [ ROLE_SALES_NOTIFICATIONS ]
# FULL CONTROL
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN]
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
# Disabling the security for the web debug toolbar, the profiler and Assetic.
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
# -> custom firewall for the admin area of the URL
admin:
pattern: /admin(.*)
context: user
form_login:
provider: fos_userbundle
login_path: /admin/login
use_forward: false
check_path: /admin/login_check
failure_path: null …Run Code Online (Sandbox Code Playgroud) symfony oauth-2.0 fosuserbundle hwioauthbundle lexikjwtauthbundle
如何从Facebook Connect获取正确的用户数据,如配置文件图片(当前返回null),名字和姓氏(似乎现在只是实现全名)?
facebook facebook-graph-api symfony fosuserbundle hwioauthbundle
我正在使用hwi-oauth软件包登录社交网络帐户,但我遇到登录gmail的问题,当我已经连接到网络时,应该直接进入系统的第一个屏幕,这个在连接Facebook时发生.但是当我连接Gmail时,它总是要求允许应用程序,而不仅仅是第一次.有谁知道为什么gmail总是要求许可?这是我的系统或Gmail帐户中的设置?
难倒在这里.使用HWIOAuthBundle允许在Symfony3上使用FOSUserBundle进行社交登录.
使用用户名和密码功能登录正常,但在使用社交登录(在我的情况下,Facebook和LinkedIn)进行身份验证时,会在重定向到登录页面时返回错误"无法找到用户名".
有任何想法吗?
相关文件的相关部分:
config.yml
fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\User
hwi_oauth:
firewall_names: [secured_area]
connect:
account_connector: hwi_oauth.user.provider.fosub_bridge
confirmation: true
resource_owners:
facebook:
type: facebook
client_id: xxx
client_secret: xxx
linkedin:
type: linkedin
client_id: xxx
client_secret: xxx
fosub:
username_iterations: 30
properties:
facebook: facebookId
linkedin: linkedinId
Run Code Online (Sandbox Code Playgroud)
security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
secured_area:
anonymous: ~
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
oauth:
resource_owners:
facebook: "/login/check-facebook"
linkedin: "/login/check-linkedin"
login_path: /login
use_forward: …Run Code Online (Sandbox Code Playgroud) 用户使用Facebook帐户登录后反映出以下问题:重定向到以下路由 /#_=_
我怎样才能将它重定向到这条路线:/或者更多的是这个/#?
在客户端,我使用骨干.
hwioauthbundle ×10
symfony ×10
php ×4
facebook ×3
doctrine-orm ×1
gmail ×1
oauth ×1
oauth-2.0 ×1
roles ×1