2016-06-09 62 views
1

如何防止未登录Laravel会话的用户下载AngularJS页面?Laravel + Angular:保护Angular Pages

我在Laravel的后端有一个网站。还有一个AngularJS应用程序位于public/myApp/index.html文件夹中。 .htaccess会返回任何引用的文件,所以http://www.example.com/myApp/index.html将返回Angular应用程序,并且所有对js和css的请求都将无需身份验证即可下载。

什么是防止一切JS,HTML和CSS文件的有关我的角度应用程序为所有用户认证到Larvel届下载(即/对myApp子目录)的最好方法?

回答

0

这些选项都不能真正解决我所寻找的问题。我最终做的是以下。我正在使用第三方Angular前端模板(来自ThemeForest的Angulr)以及数十万行代码和数百个不同文件。这些文件的很大一部分是样式表和通用JavaScript库(Angular,JQuery等)。我不介意将该内容放入公用文件夹并将文件提供给未经身份验证的用户。

但是,我的文件的另一部分是修改后的文件。例如,一个文件具有导航元素,这些元素几乎布置了我的专有业务系统的整个格式,并对业务的内部操作进行了很多说明。所以,像导航html,css和js这样简单的东西是敏感的,只应该用于通过身份验证的用户。

我所做的是将公共内容和受保护的内容拆分为相同(或至少相似)的目录树,其中一个位于/ public/*,另一个位于/ storage/app/*。我的所有非敏感内容(主要是模板样式表和通用JS库)都放在“公共”树中,而敏感内容放在我的“存储/应用程序”树中。因此,例如:

- public --- js ----- someThirdPartyJavaScript.js ----- loginController.js (unprotected) ----- ... --- libs ----- angular.js ----- jquery.js ----- ... --- css ----- unprotectedStyleSheet.css ----- ... --- tpl ----- loginTemplate.html - storage (all protected content goes in this tree) --- app ----- js ------- myApp.js ------- directives --------- myCustomDirective.js --------- businessNavigationDirective.js (sensitive and proprietary) ----- css (for protected css files) ----- libs (for protected libs) ----- tpl (for protected .html files) ------- clientInformationSheet.html (sensitive content indicating the structure of our customer data)

在.htaccess,我用下面的规则基本上返回存在于公共树中的任何文件:

# If the file exists in laravel/public and the URI does not specify ".php" then go get it. 
RewriteCond %{DOCUMENT_ROOT}/laravel/public/%{REQUEST_URI} -f 
RewriteCond %{REQUEST_URI} !^.*\.php$ 
RewriteRule ^(.*)$ laravel/public/$1 [L] 

。htaccess发送所有其他请求由Laravel处理index.php

然后,我创建了一个Laravel 5.2路由,以在我的Angular应用中捕获所有路由。请注意,中间件指定AUTH所以这些文件不会被返回到从存储目录的用户,除非用户已经验证:

use League\Flysystem\Util\MimeType as MimeType; 

Route::any('/{any}', ['middleware' => 'auth', function($uri){ 
    // Auth::logout(); 
    $uri = storage_path('app/' . $uri); 

    if (!File::exists($uri)){ 
     return "Path not found."; 
    } 

    $extension = File::extension($uri); 

    if (array_key_exists($extension, MimeType::getExtensionToMimeTypeMap())){ 
     $mimeType = MimeType::getExtensionToMimeTypeMap()[$extension]; 
    } else { 
     $mimeType = "text/plain"; 
    } 

    return response(File::get($uri)) 
     ->header('Content-Type', $mimeType); 

}])->where('any', '^MySuperCoolApplicationSubDirectory/.*'); 

保持目录结构“公共”和“存储/应用”之间非常相似使它非常容易组织哪些文件是敏感的,哪些不是,应用程序继续像以前那样运行,这次所有敏感内容都被未经授权的用户阻止。

1

我经常遇到这个问题,并且找到了一个易于实现且完全安全的解决方案。

您可以定义一个路由,在Laravel通过angularJs加载所有“安全”模板,像这样:

Route::get('/templates/secured/{name}', function ($name) { 
    if(Auth::check()) 
    return view('templates.' . $name); 
    else 
    return '404'; 
}); 

如果你真的必须验证后的服务您的静态文件。 这里是一个小黑客.... 你可以写你的静态JS和CSS代码中.php文件,并将其储存内部“模板/资产/”

然后,您可以使用同样的方法如上所述。 你也不会损失太多的速度。并且所有的CSS和js的语法着色和缩进都可以在php文件中使用。

+0

这很接近,但我没有返回位于/ ​​templates中的刀片模板。例如,我需要Laravel返回位于public/myApp/css/style.css中的文件。 js,html和其他文件存在类似的文件。我可以使用返回文件(“公共/ {...}”)或其他?我认为这会向浏览器返回一个下载请求。但是,这会起作用吗? –

+1

默认情况下,任何拥有该文件绝对路径的人都可以公开使用公共文件夹中的所有内容。 他们的路径比Laravel路由具有更高的优先级。 对于静态文件的认证,你将不得不通过PHP服务它们,这是一个非常糟糕的做法,并且很慢。 我不会推荐它。而且,你的JS和CSS文件是公开的。如果你需要保护它们,那么你的架构可能有问题。 –

+0

我用另一个解决方法更新了答案 –

0

您可以在客户端和服务器之间传递jwt(json Web令牌)。如果用户登录,jwt将被存储,所以即使在必须向laravel后端发送API请求之前,角度也可以通过不具有jwt有效负载来检测未授权的用户。我使用tymondesigns/jwt-auth来处理来自laravel的jwt和 satellizer以处理用户认证并存储从laravel传递的jwt令牌。