【问题标题】:Laravel + Angular: Securing Angular PagesLaravel + Angular:保护 Angular 页面
【发布时间】:2016-10-09 13:50:16
【问题描述】:

如何防止未登录 Laravel 会话的用户下载 AngularJS 页面?

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

对于所有认证到 Larvel 会话的用户,防止下载与我的 Angular 应用程序相关的所有 js、html 和 css 文件(即在 /myApp 子目录中)的最佳方法是什么?

【问题讨论】:

    标签: css angularjs .htaccess laravel authentication


    【解决方案1】:

    这些选项都没有真正解决我正在寻找的东西。我最终做的是以下。我正在使用具有数十万行代码和数百个不同文件的第 3 方 Angular 前端模板(来自 ThemeForest 的 Angular)。这些文件中有很大一部分是样式表和通用 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 应用程序中的所有路由。请注意,中间件指定了身份验证,因此除非用户已通过身份验证,否则这些文件不会从存储目录返回给用户:

    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/.*');
    

    保持“public”和“storage/app”之间的目录结构非常相似,可以很容易地组织哪些文件是敏感文件,哪些不是,并且应用程序继续像以前一样运行,这一次所有敏感内容都被保存阻止未经身份验证的用户。

    【讨论】:

      【解决方案2】:

      您可以在客户端和服务器之间传递 jwt(json web token)。如果用户已登录 jwt 将被存储,因此即使在您必须向 laravel 后端发送 API 请求之前,Angular 也可以通过没有 jwt 有效负载来检测未经过身份验证的用户。我使用 tymondesigns/jwt-auth 处理来自 laravel 的 jwt 和 satellizer 用于 Angular 处理用户身份验证和存储从 laravel 传递的 jwt 令牌。

      【讨论】:

        【解决方案3】:

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

        你可以像这样在 Laravel 中定义一个通过 angularJs 加载所有“安全”模板的路径:

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

        如果您确实必须在经过身份验证后提供静态文件。 这是一个小技巧...... 您可以在 .php 文件中编写静态 JS 和 CSS 代码并将它们存储在 'templates/assets/' 中

        然后您可以使用与上述相同的方法。 你也不会牺牲太多的速度。你所有的 css 和 js 语法着色和缩进都将在 php 文件中工作。

        【讨论】:

        • 这很接近,但我不会返回位于 /templates 中的刀片模板。例如,我需要 Laravel 返回位于 public/myApp/css/style.css 的文件。 js、html 和其他文件存在类似的文件。我可以使用 return File("public/{...}") 什么的吗?我认为这会向浏览器返回下载请求。但是,这行得通吗?
        • 默认情况下,公用文件夹中的所有内容都对拥有该文件绝对路径的任何人公开可用。它们的路径比 Laravel Routes 具有更高的优先级。为了验证静态文件,您必须通过 php 为它们提供服务,这是一种非常糟糕的做法,而且速度很慢。我不会推荐它。此外,您的 JS 和 CSS 文件应该是公开的。如果您需要保护它们,那么您的架构可能有问题。
        猜你喜欢
        • 1970-01-01
        • 2016-04-15
        • 2014-07-19
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 2018-02-08
        • 1970-01-01
        • 2014-07-07
        相关资源
        最近更新 更多