ruby-on-rails – AngularJs登录了用户权限
背景
我正在构建一个应用程序,根据用户是否登录,在页面上显示不同的内容. (使用ng-if)我不希望根据登录状态将用户重定向到单独的路由. 我确实要检查服务器验证,以确保只有真正登录的用户可以修改,但我想阻止非用户查看某些内容.我不确定这样做的最佳方法是什么.现在我确定这很糟糕. > AngularJS 在我的静态页面html.erb文件中 <script> window.loggedin = <%= signed_in? %>; </script> 在我的Rails控制器中 class ApplicationController < ActionController::Base helper_method :signed_in? private def current_user return nil if !session[:session_token] @user ||= User.find_by_session_token(session[:session_token]) end def signed_in? !!current_user end end 在我的角度控制器中 $scope.loggedIn = function(){ return window.loggedin; }; 题 这样做的正确(“安全”)方式是什么? 解决方法
用户访问控制(身份验证)始终是服务器端事务.换句话说,您的服务器应始终对每个请求执行身份验证检查 – 而不是客户端.您无法在客户端执行任何操作来阻止用户直接与您的服务器通信.
您尝试使用Angular的感觉是基于用户身份验证状态的可见性控制,该状态由服务器设置.看起来你对$scope.loggedIn有正确的想法.您肯定需要一种方法来了解用户是否已经过身份验证. 但是,您不应该执行window.loggedIn,因为任何人都可以更改窗口对象的状态.它不一定不那么安全,但它绝对不是一个好的解决方案.作为一般经验法则,避免全局变量. 这是我推荐的一种架构: >与身份验证服务器通信的身份验证服务 以下是它的外观: 顶级控制器 .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> 这似乎更复杂,但我喜欢它,因为它的模块化设计使其非常容易扩展和重用.代码没有经过测试,但我希望你能得到这个想法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |