Kaydet (Commit) b9a09bca authored tarafından Mert ÇELEN's avatar Mert ÇELEN

Access Token System Added

üst ae8caa3d
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class AccessToken extends Model
{
use UsesUuid;
protected $fillable = [
"user_id",
"token",
"name",
"last_used_at",
"last_used_ip",
];
}
......@@ -6,6 +6,7 @@ use App\Permission;
use App\RoleUser;
use App\User;
use App\UserSettings;
use App\AccessToken;
use App\Server;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
......@@ -106,7 +107,7 @@ class UserController extends Controller
]);
// Respond
return respond("Kullanıcı Başarıyla Silindi!",200);
return respond("Kullanıcı Başarıyla Silindi!", 200);
}
public function passwordReset()
......@@ -447,4 +448,30 @@ class UserController extends Controller
ConnectorToken::clear();
return respond("Önbellek temizlendi.");
}
public function myAccessTokens()
{
return view("user.keys");
}
public function createAccessToken()
{
$token = Str::random(64);
AccessToken::create([
"user_id" => user()->id,
"name" => request("name"),
"token" => $token,
]);
return respond("Anahtar Başarıyla Oluşturuldu<br>$token");
}
public function revokeAccessToken()
{
$token = AccessToken::find(request("token_id"));
if (!$token || $token->user_id != user()->id) {
return respond("Anahtar Bulunamadı!", 201);
}
$token->delete();
return respond("Anahtar Başarıyla Silindi");
}
}
<?php
Route::get('/widgetlar', 'Widgets\MainController@settings')->name('widgets');
Route::get('/bilesenler', 'Widgets\MainController@settings')->name('widgets');
Route::post('/widget/ekle', 'Widgets\MainController@add')->name('widget_add');
Route::view('/widget/ekle', 'widgets.add')->name('widget_add_page');
Route::view('/bilesen/ekle', 'widgets.add')->name('widget_add_page');
Route::post('/widget', 'Widgets\OneController@one')
->name('widget_one')
......
......@@ -22,13 +22,12 @@ class Kernel extends HttpKernel
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
Middleware\Language::class,
// Middleware\Authenticate::class,
// Middleware\PermissionManager::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
Middleware\VerifyCsrfToken::class,
//Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\ForcePasswordChange::class,
\App\Http\Middleware\RestrictedMode::class,
\App\Http\Middleware\APILogin::class,
],
];
......
<?php
namespace App\Http\Middleware;
use Closure;
use App\AccessToken;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;
class APILogin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (request()->headers->has("liman-token")) {
$obj = AccessToken::where([
"token" => request()->headers->get("liman-token"),
])->first();
if (!$obj) {
abort(403, "Token Geçersiz!");
}
$obj->update([
"last_used_at" => Carbon::now()->toDateTimeString(),
"last_used_ip" => $request->ip(),
]);
Auth::loginUsingId($obj->user_id);
}
return $next($request);
}
}
......@@ -19,8 +19,10 @@ class AppServiceProvider extends ServiceProvider
*
* @return void
*/
public function boot()
{
public function boot(
\Illuminate\Routing\Router $router,
\Illuminate\Contracts\Http\Kernel $kernel
) {
View::composer('layouts.header', function ($view) {
$view->with('USER_FAVORITES', user()->favorites());
});
......@@ -31,6 +33,13 @@ class AppServiceProvider extends ServiceProvider
'users' => 'App\User',
'roles' => 'App\Role',
]);
if (request()->headers->has("liman-token") == false) {
$router->pushMiddlewareToGroup(
"web",
\App\Http\Middleware\VerifyCsrfToken::class
);
}
}
/**
......
......@@ -34,7 +34,7 @@ class User extends Authenticatable
'objectguid',
'auth_type',
'last_login_at',
'last_login_ip'
'last_login_ip',
];
/**
......@@ -107,4 +107,9 @@ class User extends Authenticatable
{
return $this->belongsToMany('App\Role', "role_users");
}
public function accessTokens()
{
return $this->hasMany('\App\AccessToken');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAccessTokensTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('access_tokens', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('name');
$table->uuid('user_id');
$table->date("last_used_at")->nullable();
$table->ipAddress("last_used_ip")->nullable();
$table
->foreign("user_id")
->references("id")
->on("users")
->onDelete("cascade");
$table->string("token");
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('access_tokens');
}
}
......@@ -8,63 +8,67 @@
<li class="breadcrumb-item active" aria-current="page">{{ __('Eklenti Yönetimi') }}</li>
</ol>
</div>
<div class="col-sm-6">
<div class="float-sm-right">
<button data-toggle="tooltip" title="Ayarlar" class="btn btn-primary" onclick="openSettingsModal()"><i class="fa fa-cogs"></i></button>
</div>
</div>
</nav>
<div class="card">
<div class="card-header">
<h3 class="card-title">{{__("Eklentiler")}}</h3>
<div class="row">
<div class="col-md-3">
<div class="card card-primary card-outline">
<div class="card-body box-profile">
<h3 class="profile-username text-center">{{__("Eklentiler")}}</h3>
<p class="text-muted text-center">Bu sayfadan mevcut eklentileri görebilirsiniz. Ayrıca yeni eklenti eklemek için Yükle butonunu kullanabilirsiniz.</p>
</div>
</div>
</div>
<div class="card-body">
@include('errors')
@include('modal-button',[
"class" => "btn-primary",
"target_id" => "extensionUpload",
"text" => "Yükle"
])
@if(env('EXTENSION_DEVELOPER_MODE') == true)
@include('modal-button',[
"class" => "btn-secondary",
"target_id" => "extensionExport",
"text" => "İndir"
])
<div class="col-md-9">
<div class="card">
<div class="card-body">
@include('modal-button',[
"class" => "btn-info",
"target_id" => "newExtension",
"text" => "Yeni"
])
@endif
<br><br>
@include('table',[
"value" => extensions()->map(function($item){
if(!$item["issuer"]){
$item["issuer"] = __('Güvenli olmayan üretici!');
}
return $item;
}),
"sortable" => true,
"sortUpdateUrl" => route('update_ext_orders'),
"afterSortFunction" => 'location.reload',
"title" => [
"Eklenti Adı" , "Versiyon", "İmzalayan", "Son Güncelleme Tarihi", "*hidden*"
],
"display" => [
"name" , "version", "issuer", "updated_at", "id:extension_id"
],
"menu" => [
"Sil" => [
"target" => "delete",
"icon" => " context-menu-icon-delete"
]
],
"onclick" => env('EXTENSION_DEVELOPER_MODE') ? "details" : ""
])
"class" => "btn-primary",
"target_id" => "extensionUpload",
"text" => "Yükle"
])
@if(env('EXTENSION_DEVELOPER_MODE') == true)
@include('modal-button',[
"class" => "btn-secondary",
"target_id" => "extensionExport",
"text" => "İndir"
])
@include('modal-button',[
"class" => "btn-info",
"target_id" => "newExtension",
"text" => "Yeni"
])
@endif
<div class="float-sm-right">
<button data-toggle="tooltip" title="Ayarlar" class="btn btn-primary" onclick="openSettingsModal()"><i class="fa fa-cogs"></i></button>
</div><br><br>
@include('errors')
@include('table',[
"value" => extensions()->map(function($item){
if(!$item["issuer"]){
$item["issuer"] = __('Güvenli olmayan üretici!');
}
return $item;
}),
"sortable" => true,
"sortUpdateUrl" => route('update_ext_orders'),
"afterSortFunction" => 'location.reload',
"title" => [
"Eklenti Adı" , "Versiyon", "İmzalayan", "Son Güncelleme Tarihi", "*hidden*"
],
"display" => [
"name" , "version", "issuer", "updated_at", "id:extension_id"
],
"menu" => [
"Sil" => [
"target" => "delete",
"icon" => " context-menu-icon-delete"
]
],
"onclick" => env('EXTENSION_DEVELOPER_MODE') ? "details" : ""
])
</div>
</div>
</div>
</div>
......@@ -92,10 +96,10 @@
])
@if(env('EXTENSION_DEVELOPER_MODE') == true)
<?php
$input_extensions = [];
foreach(extensions() as $extension){
$input_extensions[$extension->display_name] = $extension->id;
}
$input_extensions = [];
foreach (extensions() as $extension) {
$input_extensions[$extension->display_name] = $extension->id;
}
?>
@include('modal',[
......
......@@ -22,7 +22,7 @@
<a class="nav-link" data-toggle="pill" href="#tab_2" role="tab" >{{__("Eklenti Veritabanı")}}</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#tab_3" role="tab">{{__("Widgetlar")}}</a>
<a class="nav-link" data-toggle="pill" href="#tab_3" role="tab">{{__("Bileşenler")}}</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#tab_4" role="tab">{{__("Fonksiyonlar")}}</a>
......
......@@ -121,7 +121,7 @@
</a>
</li>
<li class="nav-item">
<a href="/widgetlar" class="nav-link">
<a href="/bilesenler" class="nav-link">
<i class="nav-icon fas fa-chart-pie"></i>
<p>{{__("Bileşenler")}}</p>
</a>
......
......@@ -82,6 +82,11 @@
{{__("Profil")}}
</a>
</li>
<li class="nav-item">
<a href="{{route('my_access_tokens')}}" class="nav-link text-dark">
{{__("Kişisel Erişim Anahtarları")}}
</a>
</li>
<li class="nav-item">
<a onclick="request('/cikis',new FormData(),null)" class="nav-link text-dark">
{{__("Çıkış Yap")}}
......
......@@ -7,13 +7,19 @@
<li class="breadcrumb-item active" aria-current="page">{{__("Yetki Talepleri")}}</li>
</ol>
</nav>
<div class="card">
<div class="card-header">
<h3 class="card-title">{{__("Yetki Talepleri")}}</h3>
</div>
<div class="card-body">
@include('errors')
@include('table',[
<div class="row">
<div class="col-md-3">
<div class="card card-primary card-outline">
<div class="card-body box-profile">
<h3 class="profile-username text-center">{{__("Yetki Talepleri")}}</h3>
<p class="text-muted text-center">Bu sayfadan mevcut yetki taleplerini görebilirsiniz. İşlem yapmak istediğiniz talebe sağ tıklayarak işlem yapabilirsiniz.</p>
</div>
</div>
</div>
<div class="col-md-9">
<div class="card">
<div class="card-body">
@include('table',[
"value" => $requests,
"title" => [
"Tipi" , "Kullanıcı Adı" , "Not" , "Önem Derecesi", "Durumu", "*hidden*", "*hidden*"
......@@ -41,8 +47,11 @@
],
"onclick" => "userSettings"
])
</div>
</div>
</div>
</div>
</div>
<script>
function userSettings(element){
......
......@@ -7,47 +7,60 @@
<li class="breadcrumb-item active" aria-current="page">{{__("Sunucular")}}</li>
</ol>
</nav>
<div class="card">
<div class="card-header">
<h3 class="card-title">{{__("Sunucular")}}</h3>
<div class="row">
<div class="col-md-3">
<div class="card card-primary card-outline">
<div class="card-body box-profile">
<h3 class="profile-username text-center">{{__("Sunucular")}}</h3>
<p class="text-muted text-center">Bu sayfadan mevcut sunucularını görebilirsiniz. Ayrıca yeni sunucu eklemek için Sunucu Ekle butonunu kullanabilirsiniz.</p>
</div>
</div>
</div>
<div class="card-body">
@if(\App\Permission::can(user()->id,'liman','id','add_server'))
<button href="#tab_1" type="button" class="btn btn-success" data-toggle="modal" data-target="#add_server">{{__("Sunucu Ekle")}}</button><br><br>
@endif
@include('errors')
<?php
use Illuminate\Support\Facades\DB;
$servers = servers();
foreach ($servers as $server) {
$server->extension_count = DB::table('server_extensions')
->where('server_id', $server->id)
->count();
}
?>
@include('table',[
"value" => $servers,
"title" => [
"Sunucu Adı" , "İp Adresi" , "*hidden*" , "Kontrol Portu", "Eklenti Sayısı", "*hidden*" ,"*hidden*"
],
"display" => [
"name" , "ip_address", "type:type" , "control_port", "extension_count", "city:city", "id:server_id"
],
"menu" => [
"Düzenle" => [
"target" => "edit",
"icon" => " context-menu-icon-edit"
],
"Sil" => [
"target" => "delete",
"icon" => " context-menu-icon-delete"
]
],
"onclick" => "details"
])
<div class="col-md-9">
<div class="card">
<div class="card-body">
@if(\App\Permission::can(user()->id,'liman','id','add_server'))
<button href="#tab_1" type="button" class="btn btn-success" data-toggle="modal" data-target="#add_server">{{__("Sunucu Ekle")}}</button><br><br>
@endif
@include('errors')
<?php
use Illuminate\Support\Facades\DB;
$servers = servers();
foreach ($servers as $server) {
$server->extension_count = DB::table(
'server_extensions'
)
->where('server_id', $server->id)
->count();
}
?>
@include('table',[
"value" => $servers,
"title" => [
"Sunucu Adı" , "İp Adresi" , "*hidden*" , "Kontrol Portu", "Eklenti Sayısı", "*hidden*" ,"*hidden*"
],
"display" => [
"name" , "ip_address", "type:type" , "control_port", "extension_count", "city:city", "id:server_id"
],
"menu" => [
"Düzenle" => [
"target" => "edit",
"icon" => " context-menu-icon-edit"
],
"Sil" => [
"target" => "delete",
"icon" => " context-menu-icon-delete"
]
],
"onclick" => "details"
])
</div>
</div>
</div>
</div>
<div class="modal fade" id="add_server">
<div class="modal-dialog modal-xl">
<div class="modal-content">
......
@extends('layouts.app')
@section('content')
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item" aria-current="page"><a href="{{route('home')}}">{{__("Ana Sayfa")}}</a></li>
<li class="breadcrumb-item" aria-current="page"><a href="{{route('my_profile')}}">{{__("Profilim")}}</a></li>
<li class="breadcrumb-item active" aria-current="page">{{__("Kişisel Erişim Anahtarlarım")}}</li>
</ol>
</nav>
@include('errors')
<div class="row">
<div class="col-md-3">
<div class="card card-primary card-outline">
<div class="card-body box-profile">
<h3 class="profile-username text-center">{{__("Kişisel Erişim Anahtarlarım")}}</h3>
<p class="text-muted text-center">{{__("Size ait Kişisel Erişim Anahtarları'nın listesini görüntüleyebilirsiniz. Gizlilik sebebiyle eski anahtarınıza erişemezsiniz. Mevcut anahtar üzerinde işlem yapmak için sağ tıklayabilirsiniz.")}}</p>
</div>
</div>
</div>
<div class="col-md-9">
<div class="card">
<div class="card-body">
@include('modal-button',[
"class" => "btn-success",
"target_id" => "addAccessToken",
"text" => "Oluştur"
])<br><br>
@include('table',[
"value" => user()->accessTokens()->get(),
"title" => [
"Adı", "Son Kullanılan Tarih", "Son Kullanan Ip Adresi", "*hidden*"
],
"display" => [
"name" , "last_used_at", "last_used_ip", "id:token_id"
],
"menu" => [
"Sil" => [
"target" => "removeAccessToken",
"icon" => " context-menu-icon-delete"
]
]
])
</div>
</div>
</div>
</div>
@include('modal',[
"id"=>"addAccessToken",
"title" => "Anahtar Oluştur",
"url" => route('create_access_token'),
"next" => "debug",
"inputs" => [
"İsim" => "name:text"
],
"submit_text" => "Anahtarı Sil"
])
@include('modal',[
"id"=>"removeAccessToken",
"title" => "Anahtarı Sil",
"url" => route('revoke_access_token'),
"next" => "reload",
"text" => "Veri'yi silmek istediğinize emin misiniz? Bu işlem geri alınamayacaktır.",
"inputs" => [
"-:-" => "token_id:hidden"
],
"submit_text" => "Anahtarı Sil"
])
@endsection
\ No newline at end of file
......@@ -7,43 +7,50 @@
<li class="breadcrumb-item active" aria-current="page">{{__("Bileşenler")}}</li>
</ol>
</nav>
<div class="card">
<div class="card-header">
<h3 class="card-title">{{__("Bileşenler")}}</h3>
<div class="row">
<div class="col-md-3">
<div class="card card-primary card-outline">
<div class="card-body box-profile">
<h3 class="profile-username text-center">{{__("Bileşenler")}}</h3>
<p class="text-muted text-center">Bu sayfadan mevcut bileşenleri görebilirsiniz. Ayrıca yeni bileşen eklemek için Bileşen Ekle butonunu kullanabilirsiniz.</p>
</div>
</div>
</div>
<div class="card-body">
<button class="btn btn-success" onclick="window.location.href = '{{route('widget_add_page')}}'">{{__("Bileşen Ekle")}}</button>
<br><br>
@include('errors')
<?php
foreach ($widgets as $widget) {
$extension = \App\Extension::find($widget->extension_id);
if ($extension) {
$widget->extension_name = $extension->display_name;
} else {
$widget->extension_name = "Eklenti Silinmiş";
}
}
?>
@include('table',[
"value" => $widgets,
"title" => [
"Sunucu" , "Başlık" , "Eklenti", "*hidden*"
],
"display" => [
"server_name" , "title" ,"extension_name", "id:widget_id"
],
"menu" => [
"Düzenle" => [
"target" => "edit",
"icon" => " context-menu-icon-edit"
],
"Sil" => [
"target" => "delete",
"icon" => " context-menu-icon-delete"
]
]
])
<div class="col-md-9">
<div class="card">
<div class="card-body">
<button class="btn btn-success" onclick="window.location.href = '{{route('widget_add_page')}}'">{{__("Bileşen Ekle")}}</button>
<br><br>
@include('errors')
<?php foreach ($widgets as $widget) {
$extension = \App\Extension::find($widget->extension_id);
if ($extension) {
$widget->extension_name = $extension->display_name;
} else {
$widget->extension_name = "Eklenti Silinmiş";
}
} ?>
@include('table',[
"value" => $widgets,
"title" => [
"Sunucu" , "Başlık" , "Eklenti", "*hidden*"
],
"display" => [
"server_name" , "title" ,"extension_name", "id:widget_id"
],
"menu" => [
"Düzenle" => [
"target" => "edit",
"icon" => " context-menu-icon-edit"
],
"Sil" => [
"target" => "delete",
"icon" => " context-menu-icon-delete"
]
]
])
</div>
</div>
</div>
</div>
......
......@@ -106,6 +106,20 @@ Route::group(['middleware' => ['auth', 'permissions']], function () {
Route::view('/profil', 'user.self')->name('my_profile');
Route::get('/profil/anahtarlarim', 'UserController@myAccessTokens')->name(
'my_access_tokens'
);
Route::post(
'/profil/anahtarlarim/ekle',
'UserController@createAccessToken'
)->name('create_access_token');
Route::post(
'/profil/anahtarlarim/sil',
'UserController@revokeAccessToken'
)->name('revoke_access_token');
Route::post('/profil', 'UserController@selfUpdate')->name('profile_update');
Route::post('/user/update', 'UserController@adminUpdate')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!