使用新的Authenticator-based安全
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
使用新的Authenticator-based安全
5.1
介绍了作为Authenticator-based安全实验功能在Syob娱乐下载mfony 5.1。
在Syob娱乐下载mfony 5.1中,引入了一个新的身份验证系统。这个系统改变Symfony的内部安全,使其更多的可扩展的和可以理解的。ob娱乐下载
使系统
authenticator-based系统可以使用启用enable_authenticator_manager
设置:
- YAML
- XML
- PHP
1 2 3 4
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……
这个新系统是向后兼容目前的身份验证系统,除了一些例外,在这篇文章中解释:
添加对无担保的支持访问(例如匿名用户)
在Syob娱乐下载mfony,游客还没有登录到你的网站被称为匿名用户。新系统不再有匿名身份验证。相反,这些会话现在视为未经身份验证的(即没有安全令牌)。当使用isGranted ()
,结果总是会假
(即否认)作为本届会议处理用户没有任何特权。
在access_control
配置,您可以使用新的PUBLIC_ACCESS
安全属性白名单一些路线未经身份验证的访问(例如,登录页面):
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……access_control:#允许未经身份验证的用户访问登录表单- - - - - -{路径:^ / admin /登录,角色:PUBLIC_ACCESS}#但需要验证所有其他管理路线- - - - - -{路径:^ /管理,角色:ROLE_ADMIN}
允许匿名用户访问在一个定制的选民
5.2
的NullToken
类是在Symfony 5.2中引入的。ob娱乐下载
如果你使用定制的选民,您可以允许匿名用户访问为一个特殊的检查NullToken。这个令牌用于选民代表未经身份验证的访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /安全/ PostVoter.php名称空间应用程序\安全;/ /……使用ob娱乐下载\组件\安全\核心\身份验证\令牌\NullToken;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;使用ob娱乐下载\组件\安全\核心\授权\选民\选民;类PostVoter扩展选民{/ /……受保护的函数voteOnAttribute(字符串美元属性,美元主题,TokenInterface美元令牌):bool{/ /……如果(美元令牌运算符NullToken) {/ /用户未被认证,如只允许他们/ /看到公共职位返回美元主题- >isPublic ();}}}
配置身份验证入口点
有时,一个防火墙有多种方式进行身份验证(例如登录表单和一个API令牌认证)。在这些情况下,现在要求配置认证入口点。入口点用于生成响应时用户还没有经过身份验证,但试图访问一个页面,需要验证。这个可以用于实例将用户重定向到登录页面。
您可以配置使用entry_point
设置:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……防火墙:主要:#允许使用表单或HTTP基本身份验证form_login:~http_basic:~#配置表单身份验证作为未经身份验证的用户的入口点entry_point:form_login
请注意
您还可以创建自己的认证入口点通过创建一个实现类AuthenticationEntryPointInterface。你可以设置entry_point
(如服务id。entry_point: App \安全\ CustomEntryPoint
)
创建一个自定义身份验证
安全通常可以延长写作自定义身份验证提供者。authenticator-based系统下降对这些供应商的支持,还引入了一个新的身份验证接口作为自定义的身份验证的基本方法。
提示
后卫的身份验证器还支持authenticator-based系统。不过建议也更新这些当你重构应用程序到新系统。新的身份与卫兵认证器接口,接口有很多相似之处使重写更容易。
身份验证器应该实现AuthenticatorInterface。你也可以扩展AbstractAuthenticator的默认实现createAuthenticatedToken ()
方法适合大多数用例:
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
/ / src /安全/ ApiKeyAuthenticator.php名称空间应用程序\安全;使用ob娱乐下载\组件\HttpFoundation\JsonResponse;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;使用ob娱乐下载\组件\安全\核心\异常\AuthenticationException;使用ob娱乐下载\组件\安全\核心\异常\CustomUserMessageAuthenticationException;使用ob娱乐下载\组件\安全\Http\身份验证\AbstractAuthenticator;使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\UserBadge;使用ob娱乐下载\组件\安全\Http\身份验证\护照\PassportInterface;使用ob娱乐下载\组件\安全\Http\身份验证\护照\SelfValidatingPassport;类ApiKeyAuthenticator扩展AbstractAuthenticator{/ * * *呼吁每个请求决定如果这应该*用于身份验证请求。返回“false”将导致这个身份*被忽略。* /公共函数支持(请求美元请求):哦?bool{返回美元请求- >头- >有(“X-AUTH-TOKEN”);}公共函数进行身份验证(请求美元请求):PassportInterface{美元apiToken=美元请求- >头- >get (“X-AUTH-TOKEN”);如果(零= = =美元apiToken){/ /令牌头是空的,与HTTP认证失败状态/ /代码401“未经授权的”扔新CustomUserMessageAuthenticationException (“没有API提供的令牌”);}返回新SelfValidatingPassport (新UserBadge (美元apiToken));}公共函数onAuthenticationSuccess(请求美元请求,TokenInterface美元令牌、字符串美元firewallName):哦?响应{/ /成功,让请求继续比赛返回零;}公共函数onAuthenticationFailure(请求美元请求,AuthenticationException美元异常):哦?响应{美元数据= (/ /你可以定制或混淆消息“消息”= > strtr (美元异常- >getMessageKey (),美元异常- >getMessageData ())/ /或翻译这个消息/ / $ this - >翻译- >反式($例外- > getMessageKey(), $例外- > getMessageData ())];返回新JsonResponse (美元数据、响应::HTTP_UNAUTHORIZED);}}
身份验证可以使用启用custom_authenticators
设置:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……防火墙:主要:custom_authenticators:- - - - - -App \安全\ ApiKeyAuthenticator#别忘了还配置entry_point如果#身份实现AuthenticationEntryPointInterface# entry_point: App \安全\ CustomFormLoginAuthenticator
的authenticate ()
身份验证的方法是最重要的方法。它的任务是提取凭证(如用户名和密码,或API令牌)的请求
对象,并把这些变成一个安全护照。
提示
如果你想定制登录表单,您还可以延长的AbstractLoginFormAuthenticator类。
安全护照
5.2
的UserBadge
是在Symfony 5.2中引入的。ob娱乐下载在5.2之前,用户直接实例提供了护照。
护照是一个对象,其中包含的用户身份验证以及其他的信息,比如密码是否应该检查或者“记住我”的功能应该启用。
默认的护照需要用户和证书。
使用UserBadge把用户护照。的UserBadge
需要一个用户标识符(如用户名或电子邮件),用于加载用户使用用户提供者:
1 2 3 4
使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\UserBadge;/ /……美元护照=新护照(新UserBadge (美元电子邮件),美元凭证);
请注意
你可以通过一个用户装载机作为第二个参数UserBadge
。可接收userIdentifier美元
而且必须返回一个用户界面
对象(否则UsernameNotFoundException
抛出):
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
/ / src /安全/ CustomAuthenticator.php名称空间应用程序\安全;使用应用程序\存储库\UserRepository;/ /……类CustomAuthenticator扩展AbstractAuthenticator{私人美元userRepository;公共函数__construct(UserRepository美元userRepository){美元这- >userRepository =美元userRepository;}公共函数进行身份验证(请求美元请求):PassportInterface{/ /……返回新护照(新UserBadge (美元电子邮件,函数(美元userIdentifier){返回美元这- >userRepository- >findOneBy ([“电子邮件”= >美元userIdentifier]);}),美元凭证);}}
以下默认凭据支持类:
- PasswordCredentials
-
这需要一个明文
美元的密码
,这是使用进行验证为用户密码编码器配置:1 2 3 4
使用ob娱乐下载\组件\安全\Http\身份验证\护照\凭证\PasswordCredentials;/ /……返回新护照(新UserBadge (美元电子邮件),新PasswordCredentials (美元plaintextPassword));
- CustomCredentials
-
允许自定义闭包检查凭证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\安全\Http\身份验证\护照\凭证\CustomCredentials;/ /……返回新护照(新UserBadge (美元电子邮件),新CustomCredentials (/ /如果这个函数返回什么事比“真实”,凭证/ /被标记为无效。/ / $凭证参数等于下一个这个类的参数函数(美元凭证,用户界面美元用户){返回美元用户- >getApiToken () = = =美元凭证;},/ /自定义凭证美元apiToken));
自我验证护照
如果你不需要任何凭证检查(如使用API的令牌)时,您可以使用SelfValidatingPassport。这个类只需要一个UserBadge
对象和选择护照徽章。
护照徽章
的护照
也可以选择允许您添加安全徽章。徽章将更多的数据附加到护照(扩展安全性)。默认情况下,以下徽章支持:
- RememberMeBadge
-
当这个徽章被添加到护照,身份表示支持记得我。记得我是否实际使用取决于特殊
remember_me
配置。读如何添加“记住我”登录功能为更多的信息。 - PasswordUpgradeBadge
- 这是用于自动升级到一个新的哈希在成功登录的密码。这个徽章需要明文密码和密码升级程序(例如用户存储库)。看到迁移密码散列如何。
- CsrfTokenBadge
- 自动验证CSRF这个期间身份验证令牌。构造函数需要一个令牌ID(每形成独特)和CSRF令牌(独特的每个请求)。看到如何实现CSRF保护吗。
- PreAuthenticatedUserBadge
- 表明该用户pre-authenticated Symfony开始之前(即)。ob娱乐下载跳过这个pre-authentication用户检查程序。
5.2
自5.2以来,PasswordUpgradeBadge
自动添加到护照如果护照PasswordCredentials
。
例如,如果您想要添加CSRF定制身份验证,您将初始化的护照是这样的:
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
/ / src /服务/ LoginAuthenticator.php名称空间应用程序\服务;/ /……使用ob娱乐下载\组件\安全\Http\身份验证\AbstractAuthenticator;使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\CsrfTokenBadge;使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\UserBadge;使用ob娱乐下载\组件\安全\Http\身份验证\护照\护照;使用ob娱乐下载\组件\安全\Http\身份验证\护照\PassportInterface;类LoginAuthenticator扩展AbstractAuthenticator{公共函数进行身份验证(请求美元请求):PassportInterface{美元密码=美元请求- >请求- >get (“密码”);美元用户名=美元请求- >请求- >get (“用户名”);美元csrfToken=美元请求- >请求- >get (“csrf_token”);/ /……验证没有参数是空的返回新护照(新UserBadge (美元用户名),新PasswordCredentials (美元密码),(新CsrfTokenBadge (“登录”,美元csrfToken)));}}
提示
除了徽章,护照可以定义属性,允许authenticate ()
方法来存储任意信息的护照从其他身份验证方法(如访问它。createAuthenticatedToken ()
):
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
/ /……使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\UserBadge;类LoginAuthenticator扩展AbstractAuthenticator{/ /……公共函数进行身份验证(请求美元请求):PassportInterface{/ /……处理请求美元护照=新SelfValidatingPassport (新UserBadge (美元用户名),[]);/ /设置一个自定义属性(如范围)美元护照- >setAttribute (“范围”,美元oauthScope);返回美元护照;}公共函数createAuthenticatedToken(PassportInterface美元护照、字符串美元firewallName):TokenInterface{/ /读取属性值返回新CustomOauthToken (美元护照- >getUser (),美元护照- >getAttribute (“范围”));}}
5.2
护照在Symfony 5.2中引入了属性。ob娱乐下载