1
0
mirror of https://github.com/devfake/flox.git synced 2024-11-15 06:32:34 +01:00

implement auth

This commit is contained in:
devfake 2016-02-25 15:44:40 +01:00
parent 62d1546a8d
commit e05dd39cda
10 changed files with 105 additions and 15 deletions

View File

@ -0,0 +1,40 @@
<?php
namespace Flox\Http\Controllers;
use Flox\Http\Requests\LoginRequest;
use Illuminate\Contracts\Auth\Guard;
class AuthController extends Controller {
private $auth;
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
public function login(LoginRequest $request)
{
$username = $request->input('username');
$password = $request->input('password');
if($this->auth->attempt(['username' => $username, 'password' => $password], true)) {
return response('Success', 200);
}
return response('Unauthorized', 401);
}
public function logout()
{
$this->auth->logout();
}
public function checkLogin()
{
return [
'logged' => $this->auth->check()
];
}
}

View File

@ -5,19 +5,11 @@
use Flox\Item; use Flox\Item;
use Flox\Category; use Flox\Category;
use Flox\Http\Controllers\Controller; use Flox\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Request; use Illuminate\Support\Facades\Request;
use Illuminate\Support\Str; use Illuminate\Support\Str;
class FloxController extends Controller { class FloxController extends Controller {
public function checkLogin()
{
return [
'logged' => Auth::check()
];
}
public function homeItems($category, $orderBy, $loading = 5) public function homeItems($category, $orderBy, $loading = 5)
{ {
return $this->getItems($category, $orderBy, $loading); return $this->getItems($category, $orderBy, $loading);

View File

@ -0,0 +1,30 @@
<?php
namespace Flox\Http\Requests;
class LoginRequest extends Request {
public function authorize()
{
return true;
}
/**
* Login rules.
*/
public function rules()
{
return [
'username' => 'required',
'password' => 'required',
];
}
/**
* Login error.
*/
public function response(array $errors)
{
return response('Login error', 422);
}
}

View File

@ -15,7 +15,9 @@
Route::group(['prefix' => 'api'], function() { Route::group(['prefix' => 'api'], function() {
Route::get('check-login', 'FLoxController@checkLogin'); Route::post('login', 'AuthController@login');
Route::get('logout', 'AuthController@logout');
Route::get('check-login', 'AuthController@checkLogin');
Route::get('all-categories', 'FloxController@allCategories'); Route::get('all-categories', 'FloxController@allCategories');
Route::get('home-items/{category}/{orderBy}/{loading?}', 'FloxController@homeItems'); Route::get('home-items/{category}/{orderBy}/{loading?}', 'FloxController@homeItems');

View File

@ -16,6 +16,8 @@ class User extends Model implements AuthenticatableContract,
{ {
use Authenticatable, Authorizable, CanResetPassword; use Authenticatable, Authorizable, CanResetPassword;
public $timestamps = false;
/** /**
* The database table used by the model. * The database table used by the model.
* *

View File

@ -6,6 +6,10 @@ class Api extends React.Component {
return $.get(config.api + 'check-login'); return $.get(config.api + 'check-login');
} }
static login(username, password) {
return $.post(config.api + 'login', {username, password, _token: $('meta[name="csrf_token"]').attr('content')})
}
static categories() { static categories() {
return $.get(config.api + 'all-categories'); return $.get(config.api + 'all-categories');
} }

View File

@ -25,7 +25,7 @@ class Flox extends React.Component {
return ( return (
<div> <div>
<Header logged={this.state.logged} /> <Header logged={this.state.logged} />
{React.cloneElement(this.props.children, {logged: this.state.logged})} {React.cloneElement(this.props.children, {logged: this.state.logged, checkLogin: this.checkLogin.bind(this)})}
<Footer /> <Footer />
</div> </div>
); );

View File

@ -12,7 +12,7 @@ class Auth extends React.Component {
return ( return (
<div> <div>
{this.props.logged ? <Admin /> : <Login />} {this.props.logged ? <Admin /> : <Login checkLogin={this.props.checkLogin} />}
</div> </div>
); );

View File

@ -9,7 +9,8 @@ class Login extends React.Component {
this.state = { this.state = {
username: '', username: '',
password: '' password: '',
error: ''
} }
} }
@ -24,6 +25,7 @@ class Login extends React.Component {
<form className="login-form" onSubmit={this.onSubmit.bind(this)}> <form className="login-form" onSubmit={this.onSubmit.bind(this)}>
<input type="text" className="login-input" placeholder="Username" ref="username" value={this.state.username} onChange={this.setUsername.bind(this)} /> <input type="text" className="login-input" placeholder="Username" ref="username" value={this.state.username} onChange={this.setUsername.bind(this)} />
<input type="password" className="login-input" placeholder="Password" value={this.state.password} onChange={this.setPassword.bind(this)} /> <input type="password" className="login-input" placeholder="Password" value={this.state.password} onChange={this.setPassword.bind(this)} />
<span className="login-error">{this.state.error}</span>
<input type="submit" value="Login" className="login-submit" /> <input type="submit" value="Login" className="login-submit" />
</form> </form>
</div> </div>
@ -38,10 +40,20 @@ class Login extends React.Component {
let password = this.state.password; let password = this.state.password;
if( ! username || ! password) { if( ! username || ! password) {
return; return this.setState({
error: 'Username and Password are required'
});
} }
alert("submit"); Api.login(username, password).done((value) => {
this.props.checkLogin();
}).fail((value) => {
if(value.status === 422 || value.status === 401) {
this.setState({
error: 'Login not correct'
});
}
});
} }
setUsername(event) { setUsername(event) {

View File

@ -1,5 +1,5 @@
.login-wrap { .login-wrap {
width: 300px; width: 400px;
margin: 0 auto; margin: 0 auto;
} }
@ -34,3 +34,11 @@
padding: 8px 25px; padding: 8px 25px;
margin: 20px 0 0 0; margin: 20px 0 0 0;
} }
.login-error {
float: left;
clear: both;
color: #c64b4b;
font-size: 15px;
margin: 10px 0;
}