我有一个使用angularjs
的登录表单。我想将输入的凭据发送到 Laravel 5 中的默认AuthController
。我遇到的问题是服务器返回 422 Unprocessable Entity 并在回复中说:email field is required
。
HTML:
<form class="login-form" ng-controller="LoginController" name="loginForm" novalidate>
<input type="hidden" name="_token" ng-model="_token" value="<?php echo csrf_token(); ?>">
<h3 class="form-title">
Login
</h3>
<div ng-show="msg" class="alert alert-danger ng-cloak">
<button class="close" data-close="alert"></button>
<span ng-repeat="m in msgs">
@{{m}}
</span>
</div>
<div class="form-group" ng-class="{'has-error' : loginForm.$submitted && loginForm.username.$error.required}">
<!--ie8, ie9 does not support html5 placeholder, so we just show field title for that-->
<label class="control-label visible-ie8 visible-ie9">
Username
</label>
<input ng-required="true" class="form-control form-control-solid placeholder-no-fix ltr" type="text" autocomplete="off" ng-model="username" name="username"/>
<span ng-show="loginForm.$submitted && loginForm.username.$error.required" class="help-block help-block-error ng-cloak">
Error Text
</span>
</div>
<div class="form-group" ng-class="{'has-error' : loginForm.$submitted && loginForm.password.$error.required}">
<label class="control-label visible-ie8 visible-ie9">
Password
</label>
<a href="javascript:;" id="forget-password" class="forget-password">
Text
</a>
<input ng-required="true" class="form-control form-control-solid placeholder-no-fix ltr" type="password" autocomplete="off" ng-model="password" name="password"/>
<span ng-show="loginForm.$submitted && loginForm.password.$error.required" class="help-block help-block-error ng-cloak">
Text
</span>
</div>
<div class="form-actions">
<button ng-click="login(loginForm.$valid,'.login-btn')" type="submit" data-loading-text="waiting" class="btn btn-success uppercase login-btn">ورود</button>
<label class="rememberme check pull-right">
<input type="checkbox" name="remember" ng-model="remember" value="1"/>
remember me
</label>
</div>
</form>
JS控制器:
this.msgs = '';
$scope.login = function (isValid, btn) {
if(isValid) {
$(btn).button('loading');
$scope.msgs = '';
data = {
username : $scope.username,
password : $scope.password,
_token : $scope._token
};
if($scope.remember)
data.remember = $scope.remember;
$http.post('/auth/login', data)
.success(function (data, status, headers, config) {
$(btn).button('reset');
$scope.msgs = '';
})
.error(function (data, status, headers, config) {
$(btn).button('reset');
// Handle login errors here
$scope.msgs = data;
});
}
};
如何使用用户名作为标识修复默认laravel控制器的问题?
答案 0 :(得分:1)
如果您希望他们使用用户名而不是电子邮件进行登录,则应该像在username
类
AuthController
属性一样简单
class AuthController extends Controller {
protected $username = 'username';
}
原因是AuthController使用AuthenticatesUsers特征,它检查是否设置了$username
属性,如果没有,则默认为'email'
如果您希望他们可以选择使用用户名或电子邮件登录,那么这是另一个故事。 I wrote a blog post about it
答案 1 :(得分:0)
根据文档,422错误消息是语义错误。
422(不可处理实体)状态代码表示服务器 了解请求实体的内容类型(因此a 415(不支持的媒体类型)状态代码不合适),和 请求实体的语法是正确的(因此是400(错误请求) 状态代码不合适但是无法处理包含的内容 说明。例如,如果是XML,则可能会出现此错误情况 请求正文包含格式正确(即语法正确),但是 语义错误的XML指令。
在Laravel文档中,默认情况下,电子邮件字段用作“用户名”:
默认情况下,auth.basic中间件将使用上面的电子邮件列 用户记录为“用户名”。
我建议您编辑中间件配置中的auth.basic参数,以便使用“username”作为主用户名。
答案 2 :(得分:-1)
因为您只传递用户名和密码(并记住)字段。 您可能需要在数据对象中使用电子邮件密钥!
var data = { email: 'superman@gmail.com', username: 'SuperMan', password: 'ASDASD', rememberMe: true};