Как отображать сообщения авторизованного пользователя в Vue и Laravel, а автор может редактировать только сообщения автора, используя ACL? - PullRequest
0 голосов
/ 22 апреля 2020

Необходимо показать, что при авторизации Автора только он может видеть свое собственное сообщение и может редактировать, но теперь проблема в том, что Автор может видеть все сообщения и может получить доступ ко всем кнопкам редактирования. \ 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

image -> Категория Фото Закрыть Создать 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';
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...