我有一个示例,尝试使用Symfony2和FOSUserBundle创建AJAX登录。我设置我自己success_handler
和failure_handler
在form_login
我的security.yml
文件。
这是课程:
class AjaxAuthenticationListener implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface
{
/**
* This is called when an interactive authentication attempt succeeds. This
* is called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @see \Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener
* @param Request $request
* @param TokenInterface $token
* @return Response the response to return
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
if ($request->isXmlHttpRequest()) {
$result = array('success' => true);
$response = new Response(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
/**
* This is called when an interactive authentication attempt fails. This is
* called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @param Request $request
* @param AuthenticationException $exception
* @return Response the response to return
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
if ($request->isXmlHttpRequest()) {
$result = array('success' => false, 'message' => $exception->getMessage());
$response = new Response(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
}
这对于处理成功和失败的AJAX登录尝试都非常有用。但是,启用后-我无法通过标准表单POST方法(非AJAX)登录。我收到以下错误:
Catchable Fatal Error: Argument 1 passed to Symfony\Component\HttpKernel\Event\GetResponseEvent::setResponse() must be an instance of Symfony\Component\HttpFoundation\Response, null given
我希望自己的重写onAuthenticationSuccess
和onAuthenticationFailure
重写仅对XmlHttpRequests(AJAX请求)执行,如果没有,则将执行交还给原始处理程序。
有没有办法做到这一点?
TL; DR我希望AJAX请求登录尝试返回JSON响应以表示成功和失败,但我希望它不影响通过POST表单进行的标准登录。
David的回答很好,但是对于新手来说,它缺少一些细节-
因此,这是要填补空白。
除了创建AuthenticationHandler之外,还需要使用创建处理程序的捆绑软件中的服务配置将其设置为服务。默认的捆绑软件生成将创建一个xml文件,但我更喜欢yml。这是一个示例services.yml文件:
#src/Vendor/BundleName/Resources/config/services.yml
parameters:
vendor_security.authentication_handler: Vendor\BundleName\Handler\AuthenticationHandler
services:
authentication_handler:
class: %vendor_security.authentication_handler%
arguments: [@router]
tags:
- { name: 'monolog.logger', channel: 'security' }
您需要修改DependencyInjection捆绑包扩展以使用yml而不是xml,如下所示:
#src/Vendor/BundleName/DependencyInjection/BundleExtension.php
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
然后在应用程序的安全性配置中,设置对您刚定义的authentication_handler服务的引用:
# app/config/security.yml
security:
firewalls:
secured_area:
pattern: ^/
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
success_handler: authentication_handler
failure_handler: authentication_handler
容器在分派请求到 servlet引擎之前建立调用者身份。在整个请求处理过程中或直到应用成功的在请求上调用身份认证、登录或退出,调用者身份保持不变。对于异步请求,调用者身份建立在初始分派时,直到整个请求处理完成或直到应用成功的在请求上调用身份认证、登录或退出,调用者身份保持不变。 在处理请求时登录到一个应用,精确地对应有一个有效的非空的与请求关联的调用者身份,可以通过调用请求的 getRemoteU
4.8.1 登出 现在我们来完成登出的功能。修改 routes/signout.js 如下: routes/signout.js const express = require('express') const router = express.Router() const checkLogin = require('../middlewares/check').checkLogin // G
4.8.1 登出 现在我们来完成登出的功能。修改 routes/signout.js 如下: routes/signout.js var express = require('express'); var router = express.Router(); var checkLogin = require('../middlewares/check').checkLogin; // GET
用户登录 调用地址 https://api.bilibili.tv/login 需要 App Key;此API调用权限需要额外申请,具体请联系网站客服。 参数 字段 必选 类型 说明 userid/email true string 帐号名或邮箱 pwd true string 明文密码 captcha true string 验证码 (请访问 https://secure.bilibili.tv
作用 单点登录企业app、企业app H5等 依赖 获取单点登录前,员工的账户必须已经在滴滴,可使用员工添加接口将员工加入滴滴 注意 所有接口调用时需要严格遵守请求方式(GET/POST) 使用接口前需要仔细阅读每个接口的注意事项 接口报错时先阅读[通用错误解决方案][2]和当前接口文档下的接口错误解决方案
3. 登录 打开云课堂 APP,通过扫描二维码或输入讲师登录地址的方式,选择课堂模式,进入课堂登录页面,输入昵称和密码,进入课堂房间。支持识别本地相册的二维码图片。 昵称 可自定义名称,名称将会在视频窗口及聊天中显示。 课堂密码 填写房间的讲师端登录密码。 线路切换 根据所在区域,切换线路。 横竖屏设置 根据直播场景,选择横屏或者竖屏。
登陆 1. 在可连接互联网的环境轻触[PlayStation®Network]>[登陆]。 2. 输入在线ID与密码,并轻触[OK]。 登陆1次后即会保存在线ID与密码,以后将根据需要自动登陆。 无法连接网络时,可能会自动登出。 登出 若要手动登出,请轻触[PlayStation®Network]>[登出]。 若已手动登出,下次需要登陆时会显示登陆画面。请确认画面显示的内容,进行登陆操作。
使用 sentry 在控制器里面,我们使用 sentry,需要在控制器顶部 use 以下 use Sentry 登陆 之 基于凭证登陆用户 首先,登陆非常简单,就是收集表单数据,验证表单数据,我们这里主要讲解怎么验证表单数据 看下面代码 $cred = [ 'email'=>Input::get('email'), 'pa