使用角色检查的 Symfony2 FOS 登录
Symfony2 FOS login with role check
我正在使用 Symfony FOS userBundle,除一件事外一切正常。
我想在用户登录时检查用户是否具有特定角色。如果不是这样,登录必须失败。有没有办法做到这一点?我搜索了一半的互联网,但找不到解决方案。
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_PARENT: ROLE_USER
ROLE_ADMIN: ROLE_PARENT
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
mijn:
pattern: ^/
host: mijn.site
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
#csrf_token_generator: security.csrf.token_manager
# if you are using Symfony < 2.8, use the following config instead:
# csrf_provider: form.csrf_provider
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
- { host: mijn.site, path: ^/gegevens, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { host: mijn.site, path: ^/, roles: ROLE_PARENT }
所以只有用户ROLE_PARENT才能登录成功。如果它有 ROLE_ADMIN 或 ROLE_SUPERADMIN 没有 ROLE_PARENT.
,它一定会失败
我认为 FOSUserBundle 没有提供任何类似的东西,您也不需要。
您可以使用 Custom User Checkers
。这是详细解释它的 doc。集成 UserChecker
class 后,您可以使用自定义消息限制某人在 checkPreAuth
方法下登录。
一小段代码:
public function checkPreAuth(UserInterface $user)
{
if (!in_array('ROLE_PARENT', $user->getRoles()) {
$ex = new DisabledException('Only Parent Users are allowed to login!');
$ex->setUser($user);
throw $ex;
}
}
在我的几个项目中有效。
希望对您有所帮助!
非常感谢,这有效!
记住:
为此你至少需要 Symfony 2.8
您需要为防火墙中的所有安全区域定义 user_checker
我正在使用 Symfony FOS userBundle,除一件事外一切正常。
我想在用户登录时检查用户是否具有特定角色。如果不是这样,登录必须失败。有没有办法做到这一点?我搜索了一半的互联网,但找不到解决方案。
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_PARENT: ROLE_USER
ROLE_ADMIN: ROLE_PARENT
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
mijn:
pattern: ^/
host: mijn.site
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
#csrf_token_generator: security.csrf.token_manager
# if you are using Symfony < 2.8, use the following config instead:
# csrf_provider: form.csrf_provider
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
- { host: mijn.site, path: ^/gegevens, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { host: mijn.site, path: ^/, roles: ROLE_PARENT }
所以只有用户ROLE_PARENT才能登录成功。如果它有 ROLE_ADMIN 或 ROLE_SUPERADMIN 没有 ROLE_PARENT.
,它一定会失败我认为 FOSUserBundle 没有提供任何类似的东西,您也不需要。
您可以使用 Custom User Checkers
。这是详细解释它的 doc。集成 UserChecker
class 后,您可以使用自定义消息限制某人在 checkPreAuth
方法下登录。
一小段代码:
public function checkPreAuth(UserInterface $user)
{
if (!in_array('ROLE_PARENT', $user->getRoles()) {
$ex = new DisabledException('Only Parent Users are allowed to login!');
$ex->setUser($user);
throw $ex;
}
}
在我的几个项目中有效。 希望对您有所帮助!
非常感谢,这有效!
记住:
为此你至少需要 Symfony 2.8
您需要为防火墙中的所有安全区域定义 user_checker