我在Route下面检查用户是否经过身份验证,然后让他们访问该页面
<?php
Route::group([
'middleware' => 'auth',
], function() {
Route::get('/Categories-List', 'Skills\Category_Controller@index');
});
Run Code Online (Sandbox Code Playgroud)
在我看来auth()->user(),RoleID要检查用户是管理员还是其他角色.我想检查是否RoleID为1然后只让他们访问该页面.
我可以在Laravel 5.1中设置授权和身份验证
我想将我的API的JSON响应编码为UTF-8,但是每次我做出响应时,我都不想这样做:
return response()->json($res,200,['Content-type'=>'application/json;charset=utf-8'],JSON_UNESCAPED_UNICODE);
Run Code Online (Sandbox Code Playgroud)
因此,我考虑为所有API路由制作中间件,其handle(...)功能如下:
public function handle($request, Closure $next) {
$response = $next($request);
$response->header('Content-type','application/json; charset=utf-8');
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
问题是它不起作用Content-type,我的响应的标头仍然是,application/json而不是application/json; charset=utf-8;可能是因为该json(...)函数已经设置了Content-type标头,但我无法覆盖它。
我应该怎么做?
谢谢您的帮助。
在我开始之前,我想说我已经看过Failed断言HTTP状态是200而不是500以及Failed断言HTTP状态代码是200而不是500.不要让这些名字欺骗你; 他们是两个不同的职位.这两个帖子都超过9个月,没有好的答案.
我在测试路线方面遇到了一些麻烦.所以,我Laravel 5在Mac Mini上运行了一个新项目OS X Yosemite 10.10.2.我正在制作一个API.所以,我开始首先制作API的后端部分.我决定用PHPUnit这个项目来实现TDD.我的版本PHPUnit是4.0.20.我正在PHP 5.5.14和我使用的是打包服务器Laravel的artisan命令行工具.
现在,我开始确保我可以连接到服务器.所以,我的第一个测试看起来像:
public function testGetMessagesResponse()
{
$response = $this->call('GET', 'Messages');
$this->assertEquals(200, $response->getStatusCode());
}
Run Code Online (Sandbox Code Playgroud)
这传递得很好.但是,当我转到POST请求时,它失败了.这是我的第二次测试:
public function testPostMessagesResponse()
{
$response = $this->call('POST', 'Messages');
$this->assertEquals(200, $response->getStatusCode());
}
Run Code Online (Sandbox Code Playgroud)
此测试失败.这是输出的样子:
1) MessagesTest::testPostMessagesResponse
Failed asserting that 500 matches expected 200.
Run Code Online (Sandbox Code Playgroud)
在我的routes.php文件中,我确实注册了此路由:
Route::resource('Messages', 'MessagesController');
Run Code Online (Sandbox Code Playgroud)
在我的MessagesController中,我有所有必需的方法:
<?php namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class MessagesController extends Controller …Run Code Online (Sandbox Code Playgroud) 我正在制作一个检查锦标赛所有权的中间件。
所以在网址中,我有:
我需要在 $tournamentId 中获得“1”
在中间件中,我只有 $request 和 $closure 参数,所以我尝试了
$tournamentId = $request->get("tournaments");
Run Code Online (Sandbox Code Playgroud)
正如@Amir Bar 所说:
$tournamentId = $request->tournaments;
Run Code Online (Sandbox Code Playgroud)
我检查了路线
php artisan route:list
Run Code Online (Sandbox Code Playgroud)
我得到
GET|HEAD | tournaments/{tournaments} | tournaments.show | App\Http\Controllers\TournamentController@show | auth,roles,ownTournament |
DELETE | tournaments/{tournaments} | tournaments.destroy | App\Http\Controllers\TournamentController@destroy | auth,roles,ownTournament |
PATCH | tournaments/{tournaments} | | App\Http\Controllers\TournamentController@update | auth,roles,ownTournament |
PUT | tournaments/{tournaments} | tournaments.update | App\Http\Controllers\TournamentController@update | auth,roles,ownTournament |
GET|HEAD | tournaments/{tournaments}/edit | tournaments.edit | App\Http\Controllers\TournamentController@edit | auth,roles,ownTournament | | auth,roles,ownTournament |
Run Code Online (Sandbox Code Playgroud)
但没有任何作用...
我的中间件:
class …Run Code Online (Sandbox Code Playgroud) 我在控制器中使用 auth:api 中间件(Laravel 5.2)。
class RestfulController extends Controller
{
public function __construct() {
$this->middleware(['api', 'auth:api'], ['except' => ['login'] ]);
}
}
Run Code Online (Sandbox Code Playgroud)
路线:
Route::group(['prefix' => 'api'], function () {
Route::get('/login', ['uses' => 'RestfulController@login', 'as'=>'login']);
Route::get('/list', ['uses' => 'RestfulController@list', 'as'=>'list']);
});
Run Code Online (Sandbox Code Playgroud)
如果请求不包含或包含无效的 api_token 框架将重定向到登录页面。相反,我想返回带有错误的 JSON 响应。如何实施?
我创建了两个名为“MustBeAdmin”和“MustBeUser”的中间件,以确保根据用户登录将它们重定向到正确的页面并限制未经授权的内容。目前一切正常,重定向也运行良好。但我在幕后写的逻辑对我来说似乎是错误的,而且奇怪的是它仍然有效。如果我写出的逻辑至少对我来说是正确的,那么它似乎并没有按预期工作。
id (1,2,3,...)
name
role (1,2,3,...)
Run Code Online (Sandbox Code Playgroud)
id (1,2,3,...)
role (Student, Admin,...)
Run Code Online (Sandbox Code Playgroud)
public function handle($request, Closure $next)
{
if($request->user()->role == 2)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
Run Code Online (Sandbox Code Playgroud)
public function handle($request, Closure $next)
{
if($request->user()->role == 1)
{
return $next($request);
}
else
{
return redirect('/admin/users');
}
}
Run Code Online (Sandbox Code Playgroud)
'admin' => \App\Http\Middleware\MustBeAdmin::class,
'user' => \App\Http\Middleware\MustBeUser::class,
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经在内核中注册了中间件。
我得到的结果正是我需要的,但我怀疑中间件中的逻辑是否正确?
1 = Student
2 = Admin
Run Code Online (Sandbox Code Playgroud)
如果您在 MustBeAdmin 中间件中看到,我正在比较用户角色是否为 2(管理员),然后执行下一步($request),而在 MustBeUser 中间件中,我正在比较用户角色是否为 1(学生),然后执行下一步($request),然后我设置 else到 /Admin 目录。 …
我正在尝试为路由组编写一个中间件,以仅允许用户使用is_adminbe 1,但是当我访问路由时,用户为 admin ,错误消息显示:
此页面无效
localhost 将您重定向了太多次。
这是我的中间件:
public function handle($request, Closure $next)
{
if ($request->user()->is_admin === 1) {
return redirect('/cms');
}
return redirect('/contacts');
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个“CMS”键$middlewareGroups位于Kernel.php:
'cms' => [
\App\Http\Middleware\AdminMiddleware::class,
]
Run Code Online (Sandbox Code Playgroud)
并将其分配给我的路由组:
Route::group(['middleware' => 'cms'], function() {
Route::get('/cms', 'CmsController@index')->name('cms');
});
Run Code Online (Sandbox Code Playgroud)
访问/contacts正常,但是访问/cms会导致上面的错误。
我在Laravel应用程序中有大约 10 种类型的用户角色,例如
user_type_1 and user_type 4 are accessing url-1.
user_type_7, user_type_5 and user_type 4 are accessing url-2.
user_type_5, user_type_1, user_type_3 and user_type 6 are accessing url-3.
............................................
............................................
n number of combination of routes. url according to user type.
Run Code Online (Sandbox Code Playgroud)
我的route/web.php文件有大约 1500 条路由,目前没有使用中间件分隔为组。我必须限制用户只访问为那种 user_type 授权的 url。你能建议任何更好的方法来做到这一点。
我曾尝试将 url 与中间件组结合起来,如下所示,但在很少工作后离开了这种方法。
Route::group(['middleware' => ['middleware_user_type_1', 'middleware_user_type_2']], function () {
Route::get('url-1', 'XYZController@someMethod');
});
Run Code Online (Sandbox Code Playgroud)
通过这种方式,请求首先进入数组中的第一个中间件,如果用户类型无效,则不要尝试使用第二个中间件。
我有一个 Laravel 应用程序(部署在 heroku 上),我在其中收到了500 Internal Server error.
当我检查我的日志时,我在标题中看到错误方法:
响应头名称“Access-Control-Allow-Origin”包含无效字符,中止请求
我有cors middleware以下代码:
public function handle($request, Closure $next)
{
header('Access-Control-Allow-Origin : *');
header('Access-Control-Allow-Headers : Content-type, X-Auth-Token, Authorization, Origin');
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
当前的服务器设置如下所示。
具有指向多个 docker 容器的 nginx 反向代理的服务器。我们的 Laravel 5.7 应用程序使用 nginx + php7.2 FPM 在这些容器之一中运行
docker 内部的网络服务器应该向反向代理传递一个不安全的响应,这使得它在外层是安全的。
容器化 Web 服务器侦听 80。
Laravel 生成的所有 URL 都是 HTTP,即使在 config/app.php APP_URL 设置中明确指定协议为 HTTPS。
我还尝试了其他一些技巧,sslizing 中间件等,但似乎都不起作用。
任何想法?
laravel ×7
php ×6
laravel-5 ×5
laravel-5.1 ×2
laravel-5.7 ×2
heroku ×1
json ×1
laravel-5.4 ×1
laravel-5.5 ×1
routes ×1
ssl ×1
unit-testing ×1
utf-8 ×1