编辑:发现错误。代码中有一点点和平,\vendor\friendsofsymfony\oauth-server-bundle\FOS\OAuthServerBundle\Resources\config\oauth.xml
其中说:
<argument type="service" id="fos_oauth_server.user_provider" on-invalid="null" />
因此,当您在 config.yml 中的服务定义错误或只是拼写错误时(来自原始文档)
If you're authenticating users, don't forget to set the user provider. Here's an example using the FOSUserBundle user provider:
# app/config/config.yml
fos_oauth_server:
...
service:
user_provider: fos_user.user_manager
你迷路了。没有错误,没有警告,用户提供者只是空的。无论如何,感谢您阅读这篇文章。我会在 github 上讨论这个问题。
--
我正在使用FOSOAuthServerBundle构建 OAuth2 服务器。只要我请求一个带有 grant_type=password 的 access_token 并使用一个带有自定义 UserProvider 的 form_login,一切都已启动并运行。
我的 security.yml 看起来像这样。
security:
providers:
webservice:
id: webservice_user_provider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
oauth_authorize:
pattern: ^/oauth/v2/auth
form_login:
provider: webservice
check_path: login_check
login_path: login
anonymous: true
oauth_token:
pattern: ^/oauth/v2/token
security: false
api:
pattern: ^/api
fos_oauth: true
stateless: true
default:
anonymous: ~
form_login:
provider: webservice
login_path: /login
check_path: /login_check
logout:
path: /logout
target: /
login:
pattern: ^/login$
security: false
由于自定义用户提供程序不足以满足我的需求,因此我按照本教程实现了自定义身份验证提供程序。当我尝试使用标准登录表单登录时,这个也可以正常工作。我将 security.yml 更改为
oauth_authorize:
pattern: ^/oauth/v2/auth
webservice-login:
provider: webservice
check_path: login_check
login_path: /login
anonymous: true
webservice-login:
check_path: login_check
login_path: /login
provider: webservice
webservice-login 来自 SecurityFactory
class SecurityFactory extends FormLoginFactory
{
public function getKey()
{
return 'webservice-login';
}
protected function getListenerId()
{
return 'security.authentication.listener.form';
}
protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId)
{
$provider = 'security.authentication_provider.als_webservice.'.$id;
$container
->setDefinition($provider, new DefinitionDecorator('security.authentication_provider.als_webservice'))
->replaceArgument(1, new Reference($userProviderId))
->replaceArgument(3, $id)
;
return $provider;
}
}
当我现在尝试获取访问令牌时,我收到一条错误消息:错误:
Call to a member function loadUserByUsername() on a non-object in
vendor\friendsofsymfony\oauth-server-bundle\FOS\OAuthServerBundle\Storage\OAuthStorage.php at line 165.
所以基本上, UserProvider 始终为空。
有谁知道,我在这里做错了什么?我完全被卡住了,非常感谢任何帮助!