我正在尝试在Symfony2中实现非常基本的身份验证。以下是代码的主要部分我真的没有看到任何问题
修改 的 完整的security.yml
jms_security_extra:
secure_all_services: false
expressions: true
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
in_memory:
memory:
users:
user: { password: userpass, roles: [ 'ROLE_USER' ] }
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
firewalls:
login:
pattern: ^/login
anonymous: ~
secured_area:
pattern: ^/
stateless: true
form_login:
login_path: /login
check_path: /login_check
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_USER }
这很好用,匿名用户总是被重定向到loginAction控制器。
修改 的 这是完整的代码
<?php
namespace AcmeBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
class SecurityController extends Controller {
public function loginAction() {
$providerKey = 'secured_area';
$token = new UsernamePasswordToken('test', 'test', $providerKey, array('ROLE_USER'));
$this->container->get('security.context')->setToken($token);
return $this->redirect($this->generateUrl('fronthomepage'));
}
}
我没有看到任何问题,匿名用户被重定向到loginAction,创建了经过身份验证的用户,保存到令牌,然后作为经过身份验证的用户重定向到安全区域。不幸的是,我的代码以重定向循环结束,看起来安全防火墙不接受用户身份验证。你看到有什么问题吗?
答案 0 :(得分:0)
嗯,你的控制器工作是渲染表单而不是填充安全上下文。 Symfony2安全防火墙将自动为您执行此操作。除非您想构建自己的custom authentication。
,否则无需处理它换句话说,您的工作是显示登录表单和任何登录信息 可能发生的错误,但安全系统本身需要 检查提交的用户名和密码 验证用户。
请阅读此document以获得清晰的图片。
如果你想在用户登录时做一些自定义的东西,在Symfony2中你必须添加一个事件监听器,它将在用户成功登录后触发。被触发的事件是security.interactive_login
并挂钩为此,您必须在services.yml
文件中指定您的包Resources/config
目录:
答案 1 :(得分:0)
在设置经过身份验证的用户之前,请确保您需要实际的用户对象。我做了这样的事情:
class BaseController
protected function setUser($userName)
{
if (is_object($userName)) $user = $userName;
else
{
$userProvider = $this->get('zayso_core.user.provider');
// Need try/catch here
$user = $userProvider->loadUserByUsername($userName);
}
$providerKey = 'secured_area';
$providerKey = $this->container->getParameter('zayso_core.provider.key'); // secured_area
$token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());
$this->get('security.context')->setToken($token);
return $user;
}
但是,做这样的事情会绕过大部分安全系统而不建议这样做。我还想使用第三方认证系统(Janrain)。我查看了身份验证系统,最初无法做出正面或反面。这是在食谱记录存在之前。
我知道这似乎有点矫枉过正,但是一旦你完成了事情,那么它就会变得更有意义。并且您可以访问一堆漂亮的安全功能。我花了很长时间才开始了解身份验证系统,但最终还是值得的。
提示: 1.向后翻阅烹饪书。我真的很难理解发生了什么,但我开始为security.yml添加一个新的防火墙,然后为我的安全工厂添加别名。然后,我跟踪了工厂被要求做的事情。从那里我让听众启动并再次追踪通话。最后,身份验证管理器发挥作用。再次,耗时,但最终值得。了解了很多。
让我发疯的一件事就是课堂散落在各处。命名还有待改进。很难得到一个概述。我最终创建了自己的身份验证包,然后将所有内容置于安全状态。
如果您想要另一个工作包示例,请查看:https://github.com/cerad/cerad/tree/master/src/Cerad/Bundle/JanrainBundle