Необходимо показать, что при авторизации Автора только он может видеть свое собственное сообщение и может редактировать, но теперь проблема в том, что Автор может видеть все сообщения и может получить доступ ко всем кнопкам редактирования. \ Gate :: allow ('isAdmin'), если я использую этот код, он работает только для администратора, а не для сообщений автора. Пожалуйста, дайте мне решение для правильной многопользовательской аутентификации в Vue. js и Laravel
PostController. php
<?php
namespace App\Http\Controllers\API\Backend;
use App\Category;
use App\Http\Controllers\Controller;
use App\Post;
use App\User;
use App\Tag;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class PostController extends Controller
{
public function __construct()
{
$this->middleware('auth:api');
}
public function index()
{
if (\Gate::allows('isAdmin') || \Gate::allows('isAuthor')) {
$post = Post::with(['categories', 'tags', 'user'])->latest()->paginate(10);
return $post;
}
}
public function counter()
{
return Post::all()->count();
}
public function getCategory()
{
return Category::all();
}
public function getTag()
{
return Tag::all();
}
public function postEdit($id)
{
$post = Post::with(['categories', 'tags'])->findOrFail($id);
return response()->json([
'post'=>$post
]);
return ['message' => 'success'];
}
public function getCategoryEdit($id)
{
$category = Category::find($id);
return response()->json([
'category'=>$category
]);
return ['message' => 'success'];
}
public function store(Request $request)
{
$this->validate($request,[
'title'=>'required|unique:posts',
//'image'=>'sometimes|image|mimes:jpeg,png,jpg,bmp,webp',
'categories'=>'required',
'tags'=>'required',
'body'=>'required',
]);
$categories = array();
foreach($request->categories as $category){
$categories[] = $category['id'];
}
$tags = array();
foreach($request->tags as $tag){
$tags[] = $tag['id'];
}
$slug = str_slug($request->title);
if($request->image){
$imgname = time().'.' . explode('/', explode(':', substr($request->image, 0, strpos($request->image, ';')))[1])[1];
\Image::make($request->image)->save(public_path('backend/post/').$imgname);
$request->merge(['image' => $imgname]);
}else{
$imgname = "default/no-image.gif";
}
$post = new Post();
$post->user_id = auth('api')->id();
$post->title = $request->title;
$post->slug = $slug;
$post->image = $imgname;
$post->body = $request->body;
if(!empty($request->status)){
$post->status = true;
}else{
$post->status = false;
}
if(!empty($request->is_approved)){
$post->is_approved = true;
}else{
$post->is_approved = false;
}
$post->save();
//dd($post->id);
$post->categories()->attach($categories);
$post->tags()->attach($tags);
}
public function show($id)
{
$post = Post::with(['categories','tags','user'])->find($id);
return $post;
}
public function edit(Post $post)
{
return ['message'=>'I\'m edit'];
}
public function update(Request $request, $id)
{
$this->authorize('isAdmin');
$post = Post::find($id);
$this->validate($request,[
'title'=>'required',
//'image'=>'sometimes|image',
'categories'=>'required',
'tags'=>'required',
'body'=>'required',
]);
$categories = array();
foreach($request->categories as $category){
$categories[] = $category['id'];
}
$tags = array();
foreach($request->tags as $tag){
$tags[] = $tag['id'];
}
//dd($categories);
// function make_slug($string) {
// return preg_replace('/\s+/u', '-', trim($string));
// }
$slug = str_slug($request->title);
$currentPhoto = $post->image;
if($request->image != $currentPhoto){
$imgname = time().'.' . explode('/', explode(':', substr($request->image, 0, strpos($request->image, ';')))[1])[1];
\Image::make($request->image)->save(public_path('backend/post/').$imgname);
$request->merge(['image' => $imgname]);
if($currentPhoto !== 'default/no-image.gif'){
$postImagePath = public_path('backend/post/').$currentPhoto;
if(file_exists($postImagePath)){
@unlink($postImagePath);
}
}
}else{
$imgname = $request->image;
}
$post->user_id = auth('api')->id();
$post->title = $request->title;
$post->slug = $slug;
$post->image = $imgname;
$post->body = $request->body;
if(!empty($request->status)){
$post->status = true;
}else{
$post->status = false;
}
if(!empty($request->is_approved)){
$post->is_approved = true;
}else{
$post->is_approved = false;
}
$post->save();
//dd($post->id);
$post->categories()->sync($categories);
$post->tags()->sync($tags);
}
public function pending($id){
$post = Post::find($id);
if($post->is_approved == false){
$post->is_approved = true;
$post->save();
}else{
$post->is_approved = false;
$post->save();
}
}
public function status($id){
$post = Post::find($id);
if($post->status == false){
$post->status = true;
$post->save();
}else{
$post->status = false;
$post->save();
}
}
public function pendingpost(Request $request){
$pending_post = Post::with(['categories','tags','user'])->where('is_approved', false)->get();
return $pending_post;
return ['message'=>'success'];
}
public function pendingpostcounter()
{
return Post::all()->where('is_approved', false)->count();
}
public function destroy($id)
{
$this->authorize('isAdmin');
$post = Post::findOrFail($id);
// delete the user
$post->delete();
$post->categories()->detach();
$post->tags()->detach();
$currentPhoto = $post->image;
if($currentPhoto !== 'default/no-image.gif'){
$postImagePath = public_path('backend/post/').$currentPhoto;
if(file_exists($postImagePath)){
@unlink($postImagePath);
}
}
return ['message' => 'Category Deleted'];
}
}
index. vue
->
Категория Фото Закрыть Создать ID {{posts.id}} Имя {{posts.title}} Автор {{posts.user_id}} Категория : key = "catalog.id"> {{catalog? catalog.name: "нет каталога"}} Теги {{тег ? tag.name: «без тега»}} Изображение Одобрить Не одобрено Одобрить Статус В ожидании Publi sh Опубликовать содержимое × экспорт по умолчанию {компоненты : {VueEditor, Multiselect}, data () {return {editMode: false, posts: {}, значения: {}, getTag: [], getCategories: [], count: "", body: "", selected: null , форма: новая форма ({id: "", user_id: "", title: "", image: "", body: "", категории: [], теги: [], view_count: "", status: " ", одобрено: "" }) }; }, методы: {load () {if (this. $ gate.isAdminOrAuthor ()) {axios .get ("/ api / post") .then (({data}) => (this.values = data)) .catch (() => {console.log ("Ошибка ...");}); }}, ApproveBtn (ID) {// Отправить запрос http здесь это. $ Progress.start (); this.form .put (`/ api / pending /` + id) .then (() => {Swal.fire («Обновлено!», «Ваша информация успешно обновлена», «успех»); this. $ Progress. fini sh (); Fire. $ emit ("autoLoadevent");}) .catch (() => {Swal.fire ("Failed!", "Что-то не так.", "warning"); это . $ Progress.fail ();}); }, statusBtn (id) {// Отправьте запрос http здесь this. $ Progress.start (); this.form .put (`/ api / status /` + id) .then (() => {Swal.fire («Обновлено!», «Ваша информация успешно обновлена», «успех»); this. $ Progress. fini sh (); Fire. $ emit ("autoLoadevent");}) .catch (() => {Swal.fire ("Failed!", "Что-то не так.", "warning"); это . $ Прогресс. потерпеть поражение(); }); }, addCategory (newTag) {const tag = {name: newTag, code: newTag.substring (0, 2) + Math.floor (Math.random () * 10000000)}; this.optionss.pu sh (тег); this.categories.pu sh (тег); }, // updateSeleted (newSeleted) {// this.selected = newSeleted; //}, getCategory () {if (this. $ gate.isAdminOrAuthor ()) {axios .get ("/ api / getcategory") .then (response => {this.getCategories = response.data;}) .catch (() => {console.log ("Ошибка ...");}); }}, gettag () {if (this. $ gate.isAdminOrAuthor ()) {axios .get ("/ api / gettag") .then (response => {this.getTag = response.data;}) .catch ( () => {console.log ("Ошибка ...");}); }}, counter () {if (this. $ gate.isAdminOrAuthor ()) {ax ios .get ("/ api / counter /"). then (response => {//return(response.data) this .count = response.data; //console.log(response.data);}); }}, categoryPhoto (e) {let file = e.target.files [0]; //console.log(file); let reader = new FileReader (); if (file ["size"] <250000) {reader.onloadend = file => {this.form.image = reader.result; }; reader.readAsDataURL (файл); } else {Swal.fire ({icon: "error", заголовок: "Oops ...", текст: "Пожалуйста, загрузите файл размером менее 2 МБ"}); }}, getImage () {let img = this.form.image.length> 200? this.form.image: "/ backend / post /" + this.form.image; вернуть img; }, createVal () {this. $ Progress.start (); this.form .post ("/ api / post") .then (() => {Fire. $ emit ("autoLoadevent"); $ ("# addnewmodal"). modal ("hide"); toast.fire ( {icon: "success", заголовок: "сообщение успешно создано"}); this. $ Progress.fini sh ();}) .catch (() => {toast.fire ({icon: "error", title: "Что-то пошло не так"});}); }, newModal () {this.editMode = false; this.form.reset (); $ ( "# Addnewmodal") модальный ( "шоу"). }, viewModal (id) {$ ("# viewmodal"). modal ("show"); if (this. $ gate.isAdminOrAuthor ()) {axios .get ("/ api / post /" + id) .then (response => {this.posts = response.data;}) .catch (() => {console.log ("Ошибка ...");}); }}, deleteData (id) {Swal.fire ({title: «Вы уверены?», текст: «Вы не сможете отменить это!», значок: «warning», showCancelButton: true, verifyButtonColor: » # 3085d6 ", cancelButtonColor:" # d33 ", подтвердитеButtonText:" Да, удалите его! "}). Then (result => {if (result.value) {// Отправьте запрос http здесь this.form .delete (" / api / post / "+ id) .then (() => {Swal.fire (" Удалено! "," Ваш файл был удален. "," Успех "); Fire. $ emit (" autoLoadevent ");} ) .catch (() => {Swal.fire («Ошибка!», «Что-то не так.», «Предупреждение»);});}}); }}, созданный () {this.counter (); this.getCategory (); this.gettag (); this.load (); Fire. $ On ("autoLoadevent", () => {this.load ();}); }, mount () {console.log («mount»); }};
Ворота. js
export default class Gate{
constructor(user){
this.user = user;
}
isAdmin(){
return this.user.type === 'admin';
}
isAdminOrAuthor(){
if(this.user.type === 'admin' || this.user.type === 'author'){
return true;
}
}
isAuthorOrUser(){
if(this.user.type === 'author' || this.user.type === 'user'){
return true;
}
}
isAuthrized(){
if(this.user.id === this.user.user_id){
return true;
}
}
isUser(){
return this.user.type === 'user';
}
}