所有关于用户提供者
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
所有关于用户提供者
每个用户在你的应用程序通常会需要自己的“用户提供者”:一个类,它有两个工作:
- 重新加载用户的会话
-
在每个请求的开始(除非你的防火墙
无状态的
),Sob娱乐下载ymfony加载用户
从会话对象。以确保它不是过时,用户提供者“刷新”。教义用户提供者,例如,查询最新数据的数据库。ob娱乐下载Symfony然后检查用户是否已经“改变”,如果他们(见de-authenticates用户所有关于用户提供者)。 - 加载用户对某些功能
-
一些特性,比如
switch_user
,remember_me
和许多内置的身份验证提供者,使用用户提供程序加载用户对象通过它的“用户名”(或电子邮件,或任何你想要的字段)。
ob娱乐下载Symfony提供了几个内置的用户提供者:
- 实体(从数据库中加载用户):
- ldap
内存
中硬编码(用户配置)链
(尝试多个用户提供者)
或者你可以创建一个定制用户提供者。
用户配置提供者配置/包/ security.yaml
下供应商
键,每个人都有不同的配置选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#配置/包/ security.yaml安全:#……提供者:#这是内部供应商的名称#通常不重要,但可以被用来指定#提供你想要的防火墙(高级)或#为一个特定的身份验证提供者some_provider_key:#提供者类型-上述之一记忆:#提供者的自定义选项用户:用户:{密码:' % env (USER_PASSWORD) %,角色:(“ROLE_USER”]}管理:{密码:' % env (ADMIN_PASSWORD) %,角色:(“ROLE_ADMIN”]}a_chain_provider:链:提供者:[some_provider_key,another_provider_key]
创建一个自定义用户提供者
如果你加载用户从一个定制的位置(例如,通过一个API或遗留数据库连接),您需要创建一个定制的用户提供程序类。首先,确保你遵循安全指南创建您的用户
类。
如果你使用了:用户
命令来创建您的用户
类(你回答的问题表明你需要一个自定义用户提供者),该命令将生成一个骨架开始:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
/ / . .src /安全/ UserProvider.php名称空间应用程序\安全;使用ob娱乐下载\组件\安全\核心\异常\UnsupportedUserException;使用ob娱乐下载\组件\安全\核心\异常\UsernameNotFoundException;使用ob娱乐下载\组件\安全\核心\用户\用户界面;使用ob娱乐下载\组件\安全\核心\用户\UserProviderInterface;类UserProvider实现了UserProviderInterface{/ * * ob娱乐下载* Symfony调用这个方法如果使用像switch_user *或remember_me特性。* *如果你不使用这些功能,您不需要执行这个方法。* *@return用户界面* *@throwsUsernameNotFoundException如果用户没有找到* /公共函数loadUserByUsername(美元用户名){/ /加载用户从数据源对象或抛出UsernameNotFoundException。/ / $ username参数可能不是用户名:/ /这是无论getUsername返回的值是()/ /方法在用户类。扔新\异常(“TODO:填写loadUserByUsername()内的。__FILE__);}/ * * *刷新用户从会话后重新加载。* *当一个用户登录,在每个请求的开始,*用户从会话对象加载,然后调用这个方法是*。你的工作就是确保用户的数据仍然是新鲜的,*为例,重新查询新的用户数据。* *如果你的防火墙是“无状态:false”(纯API),这*方法不叫。* *@return用户界面* /公共函数refreshUser(用户界面美元用户){如果(!美元用户运算符用户){扔新UnsupportedUserException (sprintf (无效的用户类“% s”。get_class (美元用户)));}/ /返回一个用户对象在确保其数据是“新鲜”。/ /或者抛出一个UsernameNotFoundException如果用户已不复存在。扔新\异常(“TODO:填写refreshUser()内的。__FILE__);}/ * * *告诉Symob娱乐下载fony为这类用户使用这个提供者。* /公共函数supportsClass(美元类){返回用户::类= = =美元类;}}
大部分的工作已经完成了!读代码中的注释和更新待办事项部分完成用户提供者。
当你完成,告诉Symfony用户提供者通过添加ob娱乐下载它security.yaml
:
1 2 3 4 5 6
#配置/包/ security.yaml安全:提供者:#内部名称,可以是任何东西your_custom_user_provider:id:App \安全\ UserProvider
就是这样!当你使用任何的功能需要用户提供者,您的提供者将使用!如果你有多个防火墙和多个提供者,您可以指定哪一个提供者通过添加使用提供者
关键在你的防火墙和设置它的内部名称你给用户提供者。
了解用户从会话刷新
在每个请求(除非你的防火墙无状态的
),你用户
对象序列化的会话。开始下一个请求,这是反序列化,然后传递给你的用户提供“刷新”(例如学说为新用户查询)。
然后,这两个用户对象(原从会话和刷新用户对象)是“比较”,看看他们是“平等”。默认情况下,核心AbstractToken
类比较的返回值getPassword ()
,getSalt ()
和getUsername ()
方法。如果这些是不同的,您的用户将被注销。这是一个安全措施,以确保恶意用户可以de-authenticated如果核心用户数据的变化。
然而,在某些情况下,这个过程会导致意想不到的认证问题。如果你有认证的问题,可能是你是验证成功,但是你马上就会失去身份验证后第一个重定向。
在这种情况下,审查序列化逻辑(例如。SerializableInterface
)如果你有任何,以确保所有必需的字段序列化。
用户手动EquatableInterface进行比较
或者,如果你需要更多的控制“比较用户”的过程,使您的用户类实现EquatableInterface。然后,你isEqualTo ()
方法将调用当比较用户。