내 프로젝트에서 경로와 미들웨어에 문제가 있습니다. 구독자 만 볼 수있는 주제 목록이 있습니다. 그러나 주제를 공개로 표시하여 게스트 사용자 / 공개가 주제를 볼 수 있습니다.
내가 직면 한 문제는 모든 주제를 대중에게 공개하거나 전혀 공개하지 않는다는 것입니다.
다음 구독자 미들웨어가 있습니다.
public function handle(Request $request, Closure $next)
{
if ( $request->user() && ! $request->user()->subscribed('annual_membership') ) {
return redirect('profile');
}
if( Auth::Guest() ) {
return redirect('topics')->with('error', 'You need to be a registered memeber to view this topic.');
}
return $next($request);
}
이것은 이와 같이 내 커널에 추가됩니다.
protected $routeMiddleware = [
// ...
'subscriber' => \App\Http\Middleware\Subscriber::class,
];
그런 다음 다음 경로를 설정합니다.
Route::get('voting-topics', [TopicController::class, 'topics'])->name('topics');
Route::get('voting-topics/{topic}', [TopicController::class, 'topic'])->name('topic');
Route::group(['middleware' => ['subscriber']], function ()
{
Route::get('profile/billing', function (Request $request) {
return $request->user()->redirectToBillingPortal();
});
Route::get('voting-topics/{topic}', [TopicController::class, 'topic'])->name('topic');
});
그리고 주제에 대한 내 컨트롤러.
class TopicController extends Controller
{
public function topics(Request $request)
{
if ( $request->user() && $request->user()->subscribed('annual_membership') ) {
return $this->subscriberTopics();
} else {
return $this->publicTopics();
}
}
private function publicTopics()
{
$topics = Topic::orderBy('date', 'asc')->where('free_to_view', 1)->paginate(50);
return view('topics.topics', compact('topics'));
}
private function subscriberTopics()
{
$topics = Topic::orderBy('date', 'desc')->paginate(50);
return view('topics.topics', compact('topics'));
}
public function topic(Request $request, Topic $topic)
{
$topic = Topic::find($topic)->first();
return view('topics.topic', compact(['topic',));
}
}
주제 디렉토리가 제대로 작동합니다. 게스트에게는 공개로 표시된 항목 만, 구독자에게는 모든 주제가 표시됩니다. 내 코드는 현재 구독자가 모든 주제를 볼 수 있도록 허용하고 게스트는 내가 원하는 것이 아닌 공개 주제를 볼 수 있습니다.
미들웨어 경로를 제거하면 반대로 게스트가 주제의 URL을 입력하면 모든 주제에 액세스 할 수 있습니다.
편집하다
좀 더 명확하고 설명하기 위해 주제 목록이 있습니다 (기본적으로 블로그 게시물과 같음). 주제는 내 웹 사이트의 유료 구독자에게만 볼 수 있습니다. 그러나 일부 주제는보기 무료로 표시 될 수 있으며 모든 사람이 볼 수 있습니다.
example.com/voting-topics로 이동하면 무료 주제 만 표시됩니다. (정확하고 작동합니다.) 로그인하고 동일한 URL로 이동하면 로그인되어 있고 유료 구독자이기 때문에 모든 주제가 표시됩니다. (이것은 다시 정확하고 작동합니다)
미들웨어에서 중복 경로를 제거하면 example.com/voting-topics/123 또는 URL을 통해 직접 다른 주제 ID로 이동합니다. 구독자 만 볼 수 있지만 주제를 볼 수 있습니다.
중복 경로를 미들웨어에 다시 추가하면 일반 대중이 무료 주제에 액세스 할 수 없습니다.
공개로 표시된 주제에만 액세스하려면 게스트 / 일반 대중 / 비 구독자가 필요하지만 유료 구독자는 모든 주제에 액세스 할 수 있습니다. `
따라서 컨트롤러에서 수행해야하는 경로를 확인하는 것이 아니라 결국 간단한 수정 인 것 같습니다.
Route::get('voting-topics/{topic}', [TopicController::class, 'topic'])->name('topic');
미들웨어에서를 제거한 다음 컨트롤러에 다음 코드를 추가했습니다.
if( $topic->free_to_view === 1 || Auth::check() && auth()->user()->subscribed('annual_membership')) {
return view('topics.topic', compact('topic'));
} else {
return redirect()->back()->with('error', 'You need to be a paying member to view this topic');
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다