【问题标题】:Symfony 4 - JSON authentication not workingSymfony 4 - JSON 身份验证不起作用
【发布时间】:2017-12-25 21:48:49
【问题描述】:

我正在尝试基于此文档在 Symfony 中构建 json 身份验证机制: https://symfony.com/doc/current/security/json_login_setup.html

这是我的 security.yaml

security:
encoders:
    App\Entity\User:
        algorithm: bcrypt
providers:
    user_provider:
      entity:
        class: App\Entity\User
        property: username
firewalls:
    dev:
      pattern: ^/(_(profiler|wdt)|css|images|js)/
      security: false
    main:
      anonymous: ~
      json_login:
        check_path: login
      provider: user_provider
      logout:
        path: logout

这是我在安全控制器中的登录方法

class SecurityController extends Controller
{
    ...
    /**
     * @Route("/login", name="login")
     * @return Response
     */
    public function login()
    {
        return new Response('Lala');
    }
    ...
}

这是我的登录表单

<form class="form" id="login-nav">
<div class="form-group">
    <label class="sr-only" for="username">Login</label>
    <input id="username" class="form-control" placeholder="Login" required
           name="_username">
</div>
<div class="form-group">
    <label class="sr-only" for="password">Password</label>
    <input type="password" class="form-control" id="password" placeholder="Hasło" required
           name="_password">
    <div class="help-block text-right">
        <a href="">Forgot password?</a>
    </div>
</div>
<div class="form-group">
    <a id="login-submit" class="btn btn-primary btn-block">Sign in</a>
</div>
<div class="checkbox">
    <label>
        <input type="checkbox"> Remember me
    </label>
</div>

您可以在下面看到我发送给控制器的 AJAX 请求

$('#login-submit').click(function() {
    let username = $('#username').val();
    let password = $('#password').val();
    let data = JSON.stringify({username: username, password: password});
    $.ajax({
        url: '/login',
        type: 'POST',
        dataType: 'json',
        data: data,
        success: function (data, status) {
            console.log("DATA", data);
        }
    });
});

我从服务器收到 200 个状态,但没有任何反应。安全认证机制根本没有反应。 ajax 中的成功方法没有调用。我不知道为什么。我在互联网上搜索了很多,但在 Symfony 中几乎没有关于 json 身份验证的信息。 Symfony 文档中只有一个简短的描述。

【问题讨论】:

  • 您是否将username_path: security.credentials.loginpassword_path: security.credentials.password 添加到您的security.yamljson_login(如文档建议)?
  • 嘿。正如您从我的 AJAX 请求中看到的那样,我正在以最简单的格式发送 JSON:{"username": "dunglas", "password": "MyPassword"},因此无需指定 username_pathpassword_path 引用文档:如果 JSON 文档具有不同的结构,您可以使用username_pathpassword_path 键指定访问用户名和密码属性的路径(它们分别默认为用户名和密码)。
  • 您找到解决方案了吗?也许问题是非空控制器,因为此文档明确指出控制器应该为空symfony.com/doc/current/security/json_login_setup.html 我现在遇到同样的问题,不知道如何继续。
  • 我面临同样的问题。您得到了正确的响应,因为您的控制器正在返回一个有效的对象。控制器根本不应该被调用,而是被安全系统拦截。

标签: php json symfony authentication login


【解决方案1】:

我能够确定问题所在。仅当请求标头设置为 Content-Type: application/json 时才会发生拦截:

在您的控制台中试试这个:

curl -X POST -H "Content-Type: application/json" http://localhost:8000/login_check -d '{"username":"philipp","password":"test"}'

在你的情况下,这应该可以解决问题:

$('#login-submit').click(function() {
    let username = $('#username').val();
    let password = $('#password').val();
    let data = JSON.stringify({username: username, password: password});
    $.ajax({
        url: '/login',
        type: 'POST',
        contentType: "application/json",
        dataType: 'json',
        data: data,
        success: function (data, status) {
            console.log("DATA", data);
        }
    });
});

【讨论】:

  • 你如何处理记住我的部分?也处理了吗?
  • 这不适用于使用现代javascript的fetchaxios库:(有什么帮助吗?
  • 当您通过 AJAX 登录时,如何保持登录状态?在我的例子中,从 localhost-1 成功登录到 localhost-2。当我通过 $.get(url) 获取内容时,我再次得到 401。使用 NelmioCorsBundle 启用 CORS。
  • 嗨@KhalidAhmada,由于两个库都可以像上面的示例一样自定义请求标头,因此身份验证应该可以工作。请检查this 获取fetchthis 获取axios
  • 嗨@Daviz,这取决于您要实现的 API 类型。一个 REST API,例如是无状态的,无法区分用户是在线还是离线。授权凭证需要随每个请求一起发送。但是您可以使用登录功能生成特定于用户的JWT token。此令牌可能有时间限制,并将用于所有进一步的 api 请求。
猜你喜欢
  • 1970-01-01
  • 2013-04-17
  • 2023-03-20
  • 2021-09-05
  • 2021-07-20
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多