Ruby on rails AngularJs登录用户权限 背景

Ruby on rails AngularJs登录用户权限 背景,ruby-on-rails,angularjs,user-interface,ruby-on-rails-4,Ruby On Rails,Angularjs,User Interface,Ruby On Rails 4,我正在开发一个应用程序,根据用户是否登录,在页面上显示不同的内容。(使用ng if)我不希望根据登录状态将用户重定向到单独的路由。 我确实检查了服务器验证,以确保只有真正登录的用户才能修改,但我希望阻止非用户查看某些内容。我不确定最好的方法是什么。现在我确信这是不好的 安格拉斯 轨道4 在我的静态页面html.erb文件中 问题: 这样做的正确(“安全”)方式是什么 用户访问控制(身份验证)始终是服务器端事务。换句话说,您的服务器应该始终对每个请求执行身份验证检查,而不是客户端。在客户端,

我正在开发一个应用程序,根据用户是否登录,在页面上显示不同的内容。(使用ng if)我不希望根据登录状态将用户重定向到单独的路由。

我确实检查了服务器验证,以确保只有真正登录的用户才能修改,但我希望阻止非用户查看某些内容。我不确定最好的方法是什么。现在我确信这是不好的

  • 安格拉斯
  • 轨道4
在我的静态页面html.erb文件中 问题: 这样做的正确(“安全”)方式是什么

用户访问控制(身份验证)始终是服务器端事务。换句话说,您的服务器应该始终对每个请求执行身份验证检查,而不是客户端。在客户端,您无法阻止用户直接与服务器通信

听起来您试图使用Angular执行的是基于服务器设置的用户身份验证状态的可见性控制。看来您对
$scope.loggedIn
的想法是正确的。您肯定需要一种方法来知道用户是否已通过身份验证

但是,您不应该执行
window.loggedIn
,因为任何人都可以更改窗口对象的状态。它不一定不安全,但绝对不是一个好的解决方案。一般来说,避免使用全局变量

以下是我推荐的一种体系结构:

  • 与身份验证服务器通信的身份验证服务

  • 表示用户会话的会话工厂。您可能希望它保存用户ID或其他内容。如果缺少ID,则用户未通过身份验证

  • 顶级作用域对象(可能是$rootScope?或只是顶级控制器作用域?)中的一个函数,用于在模板中声明

下面是它的外观:

顶级控制器

.controller("ApplicationController", function($scope, AuthService) {
  $scope.isAuthenticated = function() {
    return AuthService.isAuthenticated();
  };
});
认证服务

.service("AuthService", function($http, UserSession) {
   this.login = function() { ... };
   this.logout = function() { ... };
   this.isAuthenticated = function() {
     return UserSession.exists();
   };
});
会话工厂

.factory("UserSession", function() {
  var currUserId = null;
  return {
    createSession: function(userId) {
      currUserId = userId;
    },
    destroySession: function() {
      currUserId = null;
    },
    exists: function() {
      return currUserId !== null;
    }
  }; 
});
HTML

<div ng-if="isAuthenticated()"> ... </div>
。。。

这看起来更复杂,但我喜欢它,因为它的模块化设计使得它很容易扩展和重用。代码未经测试,但我希望您能理解

您是否通过Angular应用程序登录前端?还是纯粹的rails?我的登录目前完全是在rails中完成的…谢谢,这太棒了!我正在构建自己的身份验证服务,但这个计划会奏效。
.service("AuthService", function($http, UserSession) {
   this.login = function() { ... };
   this.logout = function() { ... };
   this.isAuthenticated = function() {
     return UserSession.exists();
   };
});
.factory("UserSession", function() {
  var currUserId = null;
  return {
    createSession: function(userId) {
      currUserId = userId;
    },
    destroySession: function() {
      currUserId = null;
    },
    exists: function() {
      return currUserId !== null;
    }
  }; 
});
<div ng-if="isAuthenticated()"> ... </div>