<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ポリシー &#8211; ケケンタの独学ITブログ</title>
	<atom:link href="https://kekenta-it-blog.com/tag/%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC/feed/" rel="self" type="application/rss+xml" />
	<link>https://kekenta-it-blog.com</link>
	<description>プログラミングやWeb制作の情報を発信</description>
	<lastBuildDate>Tue, 18 Mar 2025 01:53:54 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://kekenta-it-blog.com/wp-content/uploads/2023/07/cropped-KEKENTA-BLOG-32x32.png</url>
	<title>ポリシー &#8211; ケケンタの独学ITブログ</title>
	<link>https://kekenta-it-blog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Laravel11】Gate（ゲート）とPolicy（ポリシー）で「認可」機能を実装する</title>
		<link>https://kekenta-it-blog.com/laravel-ver11-gate-policy/</link>
					<comments>https://kekenta-it-blog.com/laravel-ver11-gate-policy/#respond</comments>
		
		<dc:creator><![CDATA[ケケンタ]]></dc:creator>
		<pubDate>Fri, 11 Oct 2024 01:21:50 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel11]]></category>
		<category><![CDATA[ゲート]]></category>
		<category><![CDATA[ポリシー]]></category>
		<guid isPermaLink="false">https://kekenta-it-blog.com/?p=11851</guid>

					<description><![CDATA[<p><img src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/eye-catch__laravel-ver11-gate-policy__11851-1024x576.jpg" class="webfeedsFeaturedVisual" /></p>Webアプリでは、特定の機能を実行する権限があるかどうかをチェックするために「認可」という仕組みを利用します。 PHPのフレームワークであるLaravelには、この「認可」を簡単に実装する仕組みとしてGate（ゲート）と [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/eye-catch__laravel-ver11-gate-policy__11851-1024x576.jpg" class="webfeedsFeaturedVisual" /></p>
<p>Webアプリでは、<strong><span class="swl-marker mark_yellow">特定の機能を実行する権限があるかどうかをチェックする</span></strong>ために「認可」という仕組みを利用します。</p>



<p>PHPのフレームワークであるLaravelには、この<strong>「認可」を簡単に実装する仕組み</strong>としてGate（ゲート）とPolicy（ポリシー）が用意されています。</p>



<p>この記事では、<strong>Laravel11</strong>で</p>



<p class="has-text-align-center is-style-big_kakko_box"><strong><span class="swl-marker mark_yellow">Gate（ゲート）とPolicy（ポリシー）を利用して</span></strong><br><strong><span class="swl-marker mark_yellow">「認可」機能を実装する方法</span></strong></p>



<p>を解説していきます。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p><strong>「認可」と類似したものに「認証」</strong>があります。<br><strong>この２つの違い</strong>についても解説しますので、ぜひ参考にしていただけるとうれしいです！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span><span data-icon="LsLightbulb" data-id="0" style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48cGF0aCBkPSJNMzIgNDYuNUgxNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTJoMTZjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyek00MS43IDE1LjlDNDEuMyAxMyA0MCAxMC4zIDM4LjIgOCAzNC41IDMuMiAyOSAuOCAyMy4xIDEgMTQgMS40IDYuNSA4LjkgNiAxOGMtLjMgNiAyLjQgMTEuNyA3LjIgMTUuNC41LjQuOC45LjggMS41djEuNmMwIDIuMiAxLjggNCA0IDRoMTJjMi4yIDAgNC0xLjggNC00VjM1YzAtLjYuMy0xLjIuOS0xLjcgNS4zLTQgOC0xMC42IDYuOC0xNy40em0tNy4xIDEuN2gtLjNjLS43IDAtMS4zLS41LTEuNS0xLjItLjctMy4yLTMuMi01LjctNi40LTYuMy0uOC0uMS0xLjQtLjktMS4yLTEuN3MuOS0xLjQgMS43LTEuMmM0LjQuOCA4IDQuMiA4LjkgOC42LjEuOC0uNCAxLjYtMS4yIDEuOHoiPjwvcGF0aD48L3N2Zz4=)" aria-hidden="true" class="swl-inline-icon"> </span><strong>この記事で分かること</strong></span></div><div class="cap_box_content">
<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>Gate（ゲート）とPolicy（ポリシー）を使用して「認可」機能を実装する方法</li>



<li>「認証」と「認可」の違い</li>



<li>「認可」機能のレスポンスをカスタマイズする方法</li>
</ul>
</div></div>


<div class="swell-block-postLink">			<a href="https://kekenta-it-blog.com/laravel-ver11-seeder-factory/" class="c-blogLink -internal" data-style="text">
				<!-- <i class="c-blogLink__icon icon-link" role="presentation"></i> -->
				<span class="c-blogLink__icon">
					<svg xmlns="http://www.w3.org/2000/svg" class="swl-svg-link __svg" width="1em" height="1em" viewBox="0 0 48 48" role="img" aria-hidden="true" focusable="false"><path d="M21.2 30.2c-.5 0-1-.2-1.4-.6l-.7-.7c-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l7.1-7.1c2.3-2.3 5.3-3.5 8.5-3.5s6.2 1.2 8.5 3.5c4.7 4.7 4.7 12.3 0 17l-3.5 3.5c-.8.8-2 .8-2.8 0-.8-.8-.8-2 0-2.8l3.5-3.5c3.1-3.1 3.1-8.2 0-11.3-1.5-1.5-3.5-2.3-5.7-2.3-2.1 0-4.2.8-5.7 2.3l-7.1 7.1c-1.5 1.5-2.3 3.5-2.3 5.7s.8 4.2 2.3 5.7l.7.7c.8.8.8 2 0 2.8-.4.3-.9.5-1.4.5z" /><path d="M13.4 46.6c-3.1 0-6.1-1.2-8.5-3.5-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l3.5-3.5c.8-.8 2-.8 2.8 0 .8.8.8 2 0 2.8l-3.5 3.5c-1.5 1.5-2.3 3.5-2.3 5.7 0 2.1.8 4.2 2.3 5.7 3.1 3.1 8.2 3.1 11.3 0l7.1-7.1c1.5-1.5 2.3-3.5 2.3-5.7 0-2.1-.8-4.2-2.3-5.7l-.7-.7c-.8-.8-.8-2 0-2.8.8-.8 2-.8 2.8 0l.7.7c2.3 2.3 3.5 5.3 3.5 8.5s-1.2 6.2-3.5 8.5l-7.1 7.1c-2.3 2.3-5.3 3.5-8.4 3.5z" /></svg>				</span>
				<span class="c-blogLink__text">【Laravel11】シーダとファクトリでテストデータを一括作成する方法</span>
			</a>
		</div>

<div class="swell-block-postLink">			<a href="https://kekenta-it-blog.com/laravel-ver11-validation/" class="c-blogLink -internal" data-style="text">
				<!-- <i class="c-blogLink__icon icon-link" role="presentation"></i> -->
				<span class="c-blogLink__icon">
					<svg xmlns="http://www.w3.org/2000/svg" class="swl-svg-link __svg" width="1em" height="1em" viewBox="0 0 48 48" role="img" aria-hidden="true" focusable="false"><path d="M21.2 30.2c-.5 0-1-.2-1.4-.6l-.7-.7c-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l7.1-7.1c2.3-2.3 5.3-3.5 8.5-3.5s6.2 1.2 8.5 3.5c4.7 4.7 4.7 12.3 0 17l-3.5 3.5c-.8.8-2 .8-2.8 0-.8-.8-.8-2 0-2.8l3.5-3.5c3.1-3.1 3.1-8.2 0-11.3-1.5-1.5-3.5-2.3-5.7-2.3-2.1 0-4.2.8-5.7 2.3l-7.1 7.1c-1.5 1.5-2.3 3.5-2.3 5.7s.8 4.2 2.3 5.7l.7.7c.8.8.8 2 0 2.8-.4.3-.9.5-1.4.5z" /><path d="M13.4 46.6c-3.1 0-6.1-1.2-8.5-3.5-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l3.5-3.5c.8-.8 2-.8 2.8 0 .8.8.8 2 0 2.8l-3.5 3.5c-1.5 1.5-2.3 3.5-2.3 5.7 0 2.1.8 4.2 2.3 5.7 3.1 3.1 8.2 3.1 11.3 0l7.1-7.1c1.5-1.5 2.3-3.5 2.3-5.7 0-2.1-.8-4.2-2.3-5.7l-.7-.7c-.8-.8-.8-2 0-2.8.8-.8 2-.8 2.8 0l.7.7c2.3 2.3 3.5 5.3 3.5 8.5s-1.2 6.2-3.5 8.5l-7.1 7.1c-2.3 2.3-5.3 3.5-8.4 3.5z" /></svg>				</span>
				<span class="c-blogLink__text">【Laravel11】バリデーションの実装方法やエラーメッセージのカスタマイズ</span>
			</a>
		</div>

<div class="swell-block-postLink">			<a href="https://kekenta-it-blog.com/laravel-change-dbtable-col-name/" class="c-blogLink -internal" data-style="text">
				<!-- <i class="c-blogLink__icon icon-link" role="presentation"></i> -->
				<span class="c-blogLink__icon">
					<svg xmlns="http://www.w3.org/2000/svg" class="swl-svg-link __svg" width="1em" height="1em" viewBox="0 0 48 48" role="img" aria-hidden="true" focusable="false"><path d="M21.2 30.2c-.5 0-1-.2-1.4-.6l-.7-.7c-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l7.1-7.1c2.3-2.3 5.3-3.5 8.5-3.5s6.2 1.2 8.5 3.5c4.7 4.7 4.7 12.3 0 17l-3.5 3.5c-.8.8-2 .8-2.8 0-.8-.8-.8-2 0-2.8l3.5-3.5c3.1-3.1 3.1-8.2 0-11.3-1.5-1.5-3.5-2.3-5.7-2.3-2.1 0-4.2.8-5.7 2.3l-7.1 7.1c-1.5 1.5-2.3 3.5-2.3 5.7s.8 4.2 2.3 5.7l.7.7c.8.8.8 2 0 2.8-.4.3-.9.5-1.4.5z" /><path d="M13.4 46.6c-3.1 0-6.1-1.2-8.5-3.5-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l3.5-3.5c.8-.8 2-.8 2.8 0 .8.8.8 2 0 2.8l-3.5 3.5c-1.5 1.5-2.3 3.5-2.3 5.7 0 2.1.8 4.2 2.3 5.7 3.1 3.1 8.2 3.1 11.3 0l7.1-7.1c1.5-1.5 2.3-3.5 2.3-5.7 0-2.1-.8-4.2-2.3-5.7l-.7-.7c-.8-.8-.8-2 0-2.8.8-.8 2-.8 2.8 0l.7.7c2.3 2.3 3.5 5.3 3.5 8.5s-1.2 6.2-3.5 8.5l-7.1 7.1c-2.3 2.3-5.3 3.5-8.4 3.5z" /></svg>				</span>
				<span class="c-blogLink__text">【Laravel】カラム名を変更する方法【マイグレーション】</span>
			</a>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2025/03/eye-catch__school-php-and-wp__14099-300x169.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://kekenta-it-blog.com/school-php-and-wp/">PHPやWordPressを学ぶのにおすすめのプログラミングスクール【７選】</a>
						<span class="p-blogCard__excerpt">僕はこれまで独学でPHPを学習してきました。結論から言えば、それでもPHPを習得することはできました。 しかし、それに費やした累計学習期間は1年ほど。モチベーション&#8230;</span>					</div>
				</div>
			</div>
		</div>


<h2 class="wp-block-heading">「認証」と「認可」の違い</h2>



<p class="is-style-bg_stripe">まずは<strong><span class="swl-marker mark_yellow">「認証」と「認可」の違い</span></strong>について解説します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>認証</th><th>認可</th></tr></thead><tbody><tr><td><strong>ユーザーの身元を確認すること</strong></td><td><strong>特定のリソース（機能）へのアクセス権限があるかどうかを確認すること</strong></td></tr></tbody></table><figcaption class="wp-element-caption">「認証」と「認可」の違い</figcaption></figure>



<p>混同されがちですが、「認証」と「認可」には、このように<strong>役割に明確な違い</strong>があります。</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>「認証」は、ユーザーの身元を確認して不正アクセスを防ぐための仕組み</li>



<li>「認可」は、「認証」によって身元確認が行われたユーザーに、特定の機能の利用権限があるかどうかをチェックする仕組み</li>
</ul>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<p>「認可」については、管理者と閲覧者をイメージしていただくと理解しやすいかと思います。</p>



<p><strong>管理者</strong>はあらゆる機能を実行する権限を持ちますが、<strong>閲覧者</strong>にはデータを見る権限しか無く、編集・削除といった機能は実行できません。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>当記事でご紹介するGate（ゲート）やPolicy（ポリシー）は、「認可」を実装するための仕組みです！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<p>ちなみに、Laravelでは「認証」機能を簡単に実装する方法として、Laravel Breezeなどの仕組み（パッケージ）が用意されています。</p>



<p>こちらも今後、別の記事で詳しくお伝えできればと考えています。</p>



<p class="is-style-icon_info">なお、もうひとつ「認可」と混同しやすい仕組みとして<strong>バリデーション</strong>があります。<br>そちらについては<a href="https://kekenta-it-blog.com/laravel-ver11-validation/" data-type="post" data-id="11686">以下の記事</a>で実装方法を解説していますので、ご興味のある方はこちらをご覧ください。</p>


<div class="swell-block-postLink">			<a href="https://kekenta-it-blog.com/laravel-ver11-validation/" class="c-blogLink -internal" data-style="text">
				<!-- <i class="c-blogLink__icon icon-link" role="presentation"></i> -->
				<span class="c-blogLink__icon">
					<svg xmlns="http://www.w3.org/2000/svg" class="swl-svg-link __svg" width="1em" height="1em" viewBox="0 0 48 48" role="img" aria-hidden="true" focusable="false"><path d="M21.2 30.2c-.5 0-1-.2-1.4-.6l-.7-.7c-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l7.1-7.1c2.3-2.3 5.3-3.5 8.5-3.5s6.2 1.2 8.5 3.5c4.7 4.7 4.7 12.3 0 17l-3.5 3.5c-.8.8-2 .8-2.8 0-.8-.8-.8-2 0-2.8l3.5-3.5c3.1-3.1 3.1-8.2 0-11.3-1.5-1.5-3.5-2.3-5.7-2.3-2.1 0-4.2.8-5.7 2.3l-7.1 7.1c-1.5 1.5-2.3 3.5-2.3 5.7s.8 4.2 2.3 5.7l.7.7c.8.8.8 2 0 2.8-.4.3-.9.5-1.4.5z" /><path d="M13.4 46.6c-3.1 0-6.1-1.2-8.5-3.5-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l3.5-3.5c.8-.8 2-.8 2.8 0 .8.8.8 2 0 2.8l-3.5 3.5c-1.5 1.5-2.3 3.5-2.3 5.7 0 2.1.8 4.2 2.3 5.7 3.1 3.1 8.2 3.1 11.3 0l7.1-7.1c1.5-1.5 2.3-3.5 2.3-5.7 0-2.1-.8-4.2-2.3-5.7l-.7-.7c-.8-.8-.8-2 0-2.8.8-.8 2-.8 2.8 0l.7.7c2.3 2.3 3.5 5.3 3.5 8.5s-1.2 6.2-3.5 8.5l-7.1 7.1c-2.3 2.3-5.3 3.5-8.4 3.5z" /></svg>				</span>
				<span class="c-blogLink__text">【Laravel11】バリデーションの実装方法やエラーメッセージのカスタマイズ</span>
			</a>
		</div>

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4374558503914683"
     crossorigin="anonymous"></script>
<!-- ディスプレイ【横長】 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-4374558503914683"
     data-ad-slot="9744298852"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<h2 class="wp-block-heading">Gate（ゲート）とPolicy（ポリシー）の関係性</h2>



<p>Laravelで「認可」を実装するには、Gate（ゲート）やPolicy（ポリシー）を利用します。</p>



<p class="is-style-bg_stripe">この２つは、いわば<strong><span class="swl-marker mark_yellow">ルーティングとコントローラと同じ関係性</span></strong>を持ちます。<br>※<a href="https://readouble.com/laravel/11.x/ja/authorization.html#creating-policies">公式ドキュメント</a>でもそのような説明があります。</p>



<p>具体的には、以下のように関係性が類似しています。</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span><span data-icon="LsLightbulb" data-id="0" style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48cGF0aCBkPSJNMzIgNDYuNUgxNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTJoMTZjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyek00MS43IDE1LjlDNDEuMyAxMyA0MCAxMC4zIDM4LjIgOCAzNC41IDMuMiAyOSAuOCAyMy4xIDEgMTQgMS40IDYuNSA4LjkgNiAxOGMtLjMgNiAyLjQgMTEuNyA3LjIgMTUuNC41LjQuOC45LjggMS41djEuNmMwIDIuMiAxLjggNCA0IDRoMTJjMi4yIDAgNC0xLjggNC00VjM1YzAtLjYuMy0xLjIuOS0xLjcgNS4zLTQgOC0xMC42IDYuOC0xNy40em0tNy4xIDEuN2gtLjNjLS43IDAtMS4zLS41LTEuNS0xLjItLjctMy4yLTMuMi01LjctNi40LTYuMy0uOC0uMS0xLjQtLjktMS4yLTEuN3MuOS0xLjQgMS43LTEuMmM0LjQuOCA4IDQuMiA4LjkgOC42LjEuOC0uNCAxLjYtMS4yIDEuOHoiPjwvcGF0aD48L3N2Zz4=)" aria-hidden="true" class="swl-inline-icon"> </span><strong>Gate（ゲート）とPolicy（ポリシー）の関係性</strong></span></div><div class="cap_box_content">
<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li><strong>ルーティング</strong>　→　<strong>Policy（ポリシー）</strong>には「認可」の判定用のメソッドを定義</li>



<li><strong>コントローラ</strong>　→　<strong>Gate（ゲート）</strong>にはPolicy（ポリシー）で定義したメソッドを呼び出すときの「名前」を定義</li>
</ul>
</div></div>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>上記のイメージを持っていただくと、「認可」を実装するハードルもぐっと下がるので参考にしていただければと思います！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4374558503914683"
     crossorigin="anonymous"></script>
<!-- ディスプレイ【横長】 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-4374558503914683"
     data-ad-slot="9744298852"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<h2 class="wp-block-heading">【解説】Gate（ゲート）とPolicy（ポリシー）の基本的な使い方</h2>



<p class="is-style-bg_stripe">本章では具体的に<strong><span class="swl-marker mark_yellow">ゲートとポリシーを使用して「認可」を実装する手順</span></strong>を解説します。</p>



<p class="is-style-big_icon_caution">前述したように、「認可」は<strong>そのユーザーに機能の使用権限があるかどうかをチェックする仕組み</strong>です。<br><br>したがって、「認可」を実装する際には、<strong>前提としてユーザー認証機能が実装されている必要があります。</strong><br>当記事でもすでにユーザー認証機能が実装されている想定で解説を進めていきます。</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48cGF0aCBkPSJNMzIgNDYuNUgxNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTJoMTZjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyek00MS43IDE1LjlDNDEuMyAxMyA0MCAxMC4zIDM4LjIgOCAzNC41IDMuMiAyOSAuOCAyMy4xIDEgMTQgMS40IDYuNSA4LjkgNiAxOGMtLjMgNiAyLjQgMTEuNyA3LjIgMTUuNC41LjQuOC45LjggMS41djEuNmMwIDIuMiAxLjggNCA0IDRoMTJjMi4yIDAgNC0xLjggNC00VjM1YzAtLjYuMy0xLjIuOS0xLjcgNS4zLTQgOC0xMC42IDYuOC0xNy40em0tNy4xIDEuN2gtLjNjLS43IDAtMS4zLS41LTEuNS0xLjItLjctMy4yLTMuMi01LjctNi40LTYuMy0uOC0uMS0xLjQtLjktMS4yLTEuN3MuOS0xLjQgMS43LTEuMmM0LjQuOCA4IDQuMiA4LjkgOC42LjEuOC0uNCAxLjYtMS4yIDEuOHoiPjwvcGF0aD48L3N2Zz4=)" data-icon="LsLightbulb" data-id="0" aria-hidden="true" class="swl-inline-icon"> </span><strong>「認可」を実装する主な流れ</strong></span></div><div class="cap_box_content">
<ul class="wp-block-list is-style-num_circle -list-under-dashed">
<li><a href="#anc-step1">ポリシーに「認可」の判断基準となる処理を記述する</a></li>



<li><a href="#anc-step2">ゲートを定義する</a></li>



<li><a href="#anc-step3">コントローラなど、「認可」を実行したい箇所に処理を記述する</a></li>
</ul>
</div></div>



<p>なお、当記事では「TODOアプリのタスク編集権限」を例に解説を進めていきます。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>それでは、各STEPを順番に見ていきましょう！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<h3 class="wp-block-heading" id="anc-step1">STEP１　Policy（ポリシー）に「認可」の判断基準となる処理を記述する</h3>



<p class="is-style-bg_stripe">Policy（ポリシー）ファイルは以下のコマンドで作成します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>php artisan make:policy TaskPolicy</code></pre></div>



<p class="is-style-icon_pen">これにより、<code class="dir_name">app/Policies</code>ディレクトリ直下に<code class="file_name">TaskPolicy.php</code>が生成されます。</p>


<div class="wp-block-image is-style-shadow">
<figure class="aligncenter size-full"><img decoding="async" width="257" height="200" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image.png" alt="TaskPolicyが生成される" class="wp-image-11913"/><figcaption class="wp-element-caption">TaskPolicyが生成される</figcaption></figure>
</div>


<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p>補足として、ポリシーメソッドのサンプルを含んだクラスを生成したい場合は、下記のように<code>--model</code>オプションを付けます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>php artisan make:policy TaskPolicy --model=Task</code></pre></div>
</div></div>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<p>続いて、生成された<code class="file_name">TaskPolicy.php</code>に以下のソースコードを記述します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="TaskPolicy.php" data-lang="PHP"><code>public function edit(User $user, Task $task)
{
    return $user-&gt;id === $task-&gt;user_id;
}</code></pre></div>



<p>上記は<strong>Gate（ゲート）で認可処理を行う際に使用するメソッド</strong>です。</p>



<p><span class="swl-marker mark_yellow"><strong>現在ログイン中のユーザID</strong>と<strong>編集対象のタスクのユーザID＝タスク作成者</strong>が一致するかどうかを検証</span>し、結果をreturnしています。</p>



<p class="is-style-icon_pen">メソッド名はなんでも大丈夫ですが、ここでは分かりやすく<strong>edit</strong>（タスク編集ページを表示するコントローラメソッド名と同じ）にしています。</p>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<h3 class="wp-block-heading" id="anc-step2">STEP２　Gate（ゲート）を定義する</h3>



<p class="is-style-bg_stripe">Gate（ゲート）は<code class="file_name">App/Providers/AppServiceProvider.php</code>の<code>boot()</code>メソッドに定義します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="AppServiceProvider.php" data-lang="PHP" data-line="TaskPolicy.php"><code>use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    Gate::define(&#39;task-edit&#39;, [TaskPolicy::class, &#39;edit&#39;]);
}</code></pre></div>



<p class="is-style-big_icon_check">このソースコードでは、<a href="#anc-step2">STEP１</a>で実装した<code>edit()</code>メソッドの呼びだし名として<code>task-edit</code>を定義しています。</p>



<h3 class="wp-block-heading" id="anc-step3">STEP３　「認可」を実行したい箇所にGate（ゲート）による処理を記述する</h3>



<p class="is-style-bg_stripe">最後に、STEP１～STEP２で定義した「認可」機能によって権限チェックを行いたい箇所にGate（ゲート）による判定処理を記述します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="TaskController.php" data-lang="PHP"><code>/**
 * タスク編集ページを表示
 */
public function edit(Task $task)
{
    // ゲートの基本的な記述
    if (! Gate::allows(&#39;task-edit&#39;, $task)) {
        abort(403);
    }

    // ～　認可されたあとの処理　～

}</code></pre></div>



<p>上記の<code>edit()</code>は、タスク編集ページを呼び出すためのメソッドです。</p>



<p>実際にタスク編集ページを呼び出す前に、<strong>Gate（ゲート）によって権限チェック</strong>を行っています。</p>



<p class="is-style-big_icon_check"><strong>Gate::allows(&#8216;task-edit&#8217;, $task)</strong>の<code>task-edit</code>は<code class="file_name">App/Providers/AppServiceProvider.php</code>の<code>boot()</code>メソッドで定義した、Policy（ポリシー）メソッド呼び出し用の名前です。</p>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<p>また、<code>abort()</code>メソッドに403を渡すことで、権限がないときには403エラーが返るようになります。</p>


<div class="wp-block-image is-style-browser_mac size_xs">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="464" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-1-1024x464.png" alt="403エラー画面" class="wp-image-11918" srcset="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-1-1024x464.png 1024w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-1-300x136.png 300w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-1-768x348.png 768w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-1.png 1097w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">403エラー画面</figcaption></figure>
</div>


<p class="is-style-icon_pen">■ 補足：404を渡せば404エラーが返るようになります。</p>


<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4374558503914683"
     crossorigin="anonymous"></script>
<!-- ディスプレイ【横長】 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-4374558503914683"
     data-ad-slot="9744298852"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<h2 class="wp-block-heading">【補足】Gate（ゲート）の処理を簡単に書く</h2>



<p class="is-style-bg_stripe">以上がGate（ゲート）の基本的な書き方ですが、もう少し<strong><span class="swl-marker mark_yellow">シンプルに書く方法</span></strong>もあります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="TaskController.php" data-lang="PHP"><code>/**
 * タスク編集ページを表示
 */
public function edit(Task $task)
{
    // ゲートの基本的な記述
    // if (! Gate::allows(&#39;task-edit&#39;, $task)) {
    //     abort(403);
    // }

    // ゲート記述簡単化
    Gate::authorize(&#39;task-edit&#39;, $task);

    // ～　認可されたあとの処理　～

}</code></pre></div>



<p>上記のように<code>Gate::authorize('task-edit', $task);</code>とするだけで認可処理を実行できます。</p>



<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<h3 class="wp-block-heading">エラーメッセージのカスタマイズ</h3>



<p>この書き方の場合、エラーメッセージ部分は以下のようになります。</p>


<div class="wp-block-image is-style-browser_mac size_xs">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="442" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-3-1024x442.png" alt="Gate::authorize()によるエラー画面" class="wp-image-11927" srcset="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-3-1024x442.png 1024w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-3-300x129.png 300w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-3-768x331.png 768w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-3.png 1089w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Gate::authorize()によるエラー画面</figcaption></figure>
</div>


<p>もしも<strong>エラーメッセージをカスタマイズしたい場合</strong>は、Policy（ポリシー）のメソッド内の処理を以下のように修正します。</p>



<p class="is-style-balloon_box"><strong>エラーメッセージをカスタマイズ</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="TaskPolicy.php" data-lang="PHP" data-line="TaskPolicy.php"><code>use Illuminate\Auth\Access\Response;  // 追加

public function edit(User $user, Task $task)
{
    // 元々の処理
    //return $user-&gt;id === $task-&gt;user_id;
    
    // エラーメッセージカスタマイズ
    return $user-&gt;id === $task-&gt;user_id
             ? Response::allow()
             : Response::deny(&#39;タスクの編集権限がありません。&#39;);
}</code></pre></div>


<div class="wp-block-image is-style-browser_mac size_xs">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="420" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-4-1024x420.png" alt="エラーメッセージカスタマイズ後の画面
" class="wp-image-11930" srcset="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-4-1024x420.png 1024w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-4-300x123.png 300w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-4-768x315.png 768w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-4.png 1088w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">エラーメッセージカスタマイズ後の画面</figcaption></figure>
</div>


<p class="has-text-align-center"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ0OCA1MTIiPjxwYXRoIGQ9Ik0yMDEuNCAzNzQuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMGwxNjAtMTYwYzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwTDIyNCAzMDYuNyA4Ni42IDE2OS40Yy0xMi41LTEyLjUtMzIuOC0xMi41LTQ1LjMgMHMtMTIuNSAzMi44IDAgNDUuM2wxNjAgMTYweiI+PC9wYXRoPjwvc3ZnPg==)" data-icon="FasAngleDown" data-id="1" aria-hidden="true" class="swl-inline-icon"> </span></p>



<h3 class="wp-block-heading">HTTPレスポンスを任意のものにする</h3>



<p class="is-style-bg_stripe">403エラーではなく、<strong>別のHTTPレスポンスを返したい場合</strong>は以下のように記述することも可能です。</p>



<p class="is-style-balloon_box"><strong>HTTPレスポンスを任意のものにする</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="TaskPolicy.php" data-lang="PHP" data-line="9" data-start="0"><code>use Illuminate\Auth\Access\Response;  // 追加

public function edit(User $user, Task $task)
{
    // 元々の処理
    //return $user-&gt;id === $task-&gt;user_id;
    
    // エラーメッセージカスタマイズ
    return $user-&gt;id === $task-&gt;user_id
             ? Response::allow()
             : Response::denyWithStatus(404);
}</code></pre></div>


<div class="wp-block-image is-style-browser_mac size_xs">
<figure class="aligncenter size-full"><img decoding="async" width="1006" height="440" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-6.png" alt="HTTPレスポンスを404エラーへ変更" class="wp-image-11934" srcset="https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-6.png 1006w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-6-300x131.png 300w, https://kekenta-it-blog.com/wp-content/uploads/2024/10/image-6-768x336.png 768w" sizes="(max-width: 1006px) 100vw, 1006px" /><figcaption class="wp-element-caption">HTTPレスポンスを404エラーへ変更</figcaption></figure>
</div>


<p class="is-style-big_icon_point">Gate（ゲート）によるレスポンスのカスタマイズについては他にも色々な仕組みが用意されています。<br><br>詳しくは<a href="https://readouble.com/laravel/11.x/ja/authorization.html" target="_blank" rel="noreferrer noopener">Laravel11 公式ドキュメント（日本語）<span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48cGF0aCBkPSJNNDQgMkgzMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDJoOS4yTDI0IDIxLjJjLS44LjgtLjggMiAwIDIuOHMyIC44IDIuOCAwTDQyIDguOFYxOGMwIDEuMS45IDIgMiAyczItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PHBhdGggZD0iTTQxIDI3Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS0uOSAyLTIgMkg5Yy0xLjEgMC0yLS45LTItMlYxMWMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMkg5Yy0zLjMgMC02IDIuNy02IDZ2MjhjMCAzLjMgMi43IDYgNiA2aDI4YzMuMyAwIDYtMi43IDYtNlYyOWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L3N2Zz4=)" data-icon="LsExternalLink" data-id="4" aria-hidden="true" class="swl-inline-icon"> </span></a>をご覧ください。</p>


<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4374558503914683"
     crossorigin="anonymous"></script>
<!-- ディスプレイ【横長】 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-4374558503914683"
     data-ad-slot="9744298852"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>



<h2 class="wp-block-heading">まとめ</h2>



<p>以上が<strong><span class="swl-marker mark_yellow">Laravel11で「認可」機能を実装する方法</span></strong>でした。</p>



<p>この記事でご紹介したのはGate（ゲート）やPolicy（ポリシー）の使い方の中でも最も基本的な内容です。</p>



<p>ただ、ここまでの内容を理解できていれば、あとは<a href="https://readouble.com/laravel/11.x/ja/authorization.html">公式ドキュメント<span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48cGF0aCBkPSJNNDQgMkgzMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDJoOS4yTDI0IDIxLjJjLS44LjgtLjggMiAwIDIuOHMyIC44IDIuOCAwTDQyIDguOFYxOGMwIDEuMS45IDIgMiAyczItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PHBhdGggZD0iTTQxIDI3Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS0uOSAyLTIgMkg5Yy0xLjEgMC0yLS45LTItMlYxMWMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMkg5Yy0zLjMgMC02IDIuNy02IDZ2MjhjMCAzLjMgMi43IDYgNiA2aDI4YzMuMyAwIDYtMi43IDYtNlYyOWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L3N2Zz4=)" data-icon="LsExternalLink" data-id="4" aria-hidden="true" class="swl-inline-icon"> </span></a>をご覧いただくことでご自身の状況に適したカスタマイズができるかと思います。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>この記事が少しでもお役に立ったなら何よりです！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<p>当ブログではLaravelやPHP、WordPressなどに関する情報を発信しています。</p>



<p>ご興味のある方はほかの記事もご覧いただけるとうれしいです。</p>



<p>それでは、最後までご覧いただきありがとうございました！</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2024/09/eye-catch__laravel-ver11-validation__11686-300x169.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://kekenta-it-blog.com/laravel-ver11-validation/">【Laravel11】バリデーションの実装方法やエラーメッセージのカスタマイズ</a>
						<span class="p-blogCard__excerpt">Laravelではバリデーションを簡単に実装する仕組みが用意されています。 この記事ではLaravelバージョン11でバリデーションを実装する方法をご紹介します。  この記事で&#8230;</span>					</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/eye-catch__laravel-ver11-seeder-factory__11960-300x169.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://kekenta-it-blog.com/laravel-ver11-seeder-factory/">【Laravel11】シーダとファクトリでテストデータを一括作成する方法</a>
						<span class="p-blogCard__excerpt">Webアプリ開発をするときは、実際の画面表示やデータ処理の動きなどを確認するためにテストデータを作成する必要があります。 テストデータは手作業で入力していっても&#8230;</span>					</div>
				</div>
			</div>
		</div>

<div class="p-blogParts post_content" data-partsID="12516">
<p class="is-style-balloon_box"><span style="--the-icon-svg: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjFlbSIgd2lkdGg9IjFlbSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBhcmlhLWhpZGRlbj0idHJ1ZSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48cGF0aCBkPSJNMzIgNDYuNUgxNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTJoMTZjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyek00MS43IDE1LjlDNDEuMyAxMyA0MCAxMC4zIDM4LjIgOCAzNC41IDMuMiAyOSAuOCAyMy4xIDEgMTQgMS40IDYuNSA4LjkgNiAxOGMtLjMgNiAyLjQgMTEuNyA3LjIgMTUuNC41LjQuOC45LjggMS41djEuNmMwIDIuMiAxLjggNCA0IDRoMTJjMi4yIDAgNC0xLjggNC00VjM1YzAtLjYuMy0xLjIuOS0xLjcgNS4zLTQgOC0xMC42IDYuOC0xNy40em0tNy4xIDEuN2gtLjNjLS43IDAtMS4zLS41LTEuNS0xLjItLjctMy4yLTMuMi01LjctNi40LTYuMy0uOC0uMS0xLjQtLjktMS4yLTEuN3MuOS0xLjQgMS43LTEuMmM0LjQuOCA4IDQuMiA4LjkgOC42LjEuOC0uNCAxLjYtMS4yIDEuOHoiPjwvcGF0aD48L3N2Zz4=)" data-icon="LsLightbulb" data-id="0" aria-hidden="true" class="swl-inline-icon"> </span><strong>Laravelのおすすめ記事</strong></p>


<div class="p-postListWrap"><ul class="p-postList -type-simple"><li class="p-postList__item">
	<a href="https://kekenta-it-blog.com/laravel-change-dbtable-col-name/" class="p-postList__link">
		<div class="p-postList__body">
			<div class="p-postList__meta">
				<div class="p-postList__times c-postTimes u-thin">
	<time class="c-postTimes__posted icon-posted" datetime="2024-12-11" aria-label="公開日">2024-12-11</time></div>
			</div>
			<h2 class="p-postList__title">【Laravel】カラム名を変更する方法【マイグレーション】</h2>		</div>
	</a>
</li>
<li class="p-postList__item">
	<a href="https://kekenta-it-blog.com/laravel11-change-dbtable-col-type/" class="p-postList__link">
		<div class="p-postList__body">
			<div class="p-postList__meta">
				<div class="p-postList__times c-postTimes u-thin">
	<time class="c-postTimes__posted icon-posted" datetime="2024-12-04" aria-label="公開日">2024-12-04</time></div>
			</div>
			<h2 class="p-postList__title">【Laravel】データベーステーブルのカラムタイプを変更する方法【マイグレーション】</h2>		</div>
	</a>
</li>
<li class="p-postList__item">
	<a href="https://kekenta-it-blog.com/laravel-introduction/" class="p-postList__link">
		<div class="p-postList__body">
			<div class="p-postList__meta">
				<div class="p-postList__times c-postTimes u-thin">
	<time class="c-postTimes__posted icon-posted" datetime="2024-11-17" aria-label="公開日">2024-11-17</time></div>
			</div>
			<h2 class="p-postList__title">【Laravel】インストール方法～初めてのデータ出力の流れを丁寧に解説！</h2>		</div>
	</a>
</li>
<li class="p-postList__item">
	<a href="https://kekenta-it-blog.com/laravel-ver11-seeder-factory/" class="p-postList__link">
		<div class="p-postList__body">
			<div class="p-postList__meta">
				<div class="p-postList__times c-postTimes u-thin">
	<time class="c-postTimes__posted icon-posted" datetime="2024-10-18" aria-label="公開日">2024-10-18</time></div>
			</div>
			<h2 class="p-postList__title">【Laravel11】シーダとファクトリでテストデータを一括作成する方法</h2>		</div>
	</a>
</li>
<li class="p-postList__item">
	<a href="https://kekenta-it-blog.com/laravel-ver11-gate-policy/" class="p-postList__link">
		<div class="p-postList__body">
			<div class="p-postList__meta">
				<div class="p-postList__times c-postTimes u-thin">
	<time class="c-postTimes__posted icon-posted" datetime="2024-10-11" aria-label="公開日">2024-10-11</time></div>
			</div>
			<h2 class="p-postList__title">【Laravel11】Gate（ゲート）とPolicy（ポリシー）で「認可」機能を実装する</h2>		</div>
	</a>
</li>
<li class="p-postList__item">
	<a href="https://kekenta-it-blog.com/laravel-ver11-validation/" class="p-postList__link">
		<div class="p-postList__body">
			<div class="p-postList__meta">
				<div class="p-postList__times c-postTimes u-thin">
	<time class="c-postTimes__posted icon-posted" datetime="2024-09-29" aria-label="公開日">2024-09-29</time></div>
			</div>
			<h2 class="p-postList__title">【Laravel11】バリデーションの実装方法やエラーメッセージのカスタマイズ</h2>		</div>
	</a>
</li>
</ul></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://kekenta-it-blog.com/laravel-ver11-gate-policy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
