加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – AngularJs登录了用户权限

发布时间:2020-12-17 02:23:14 所属栏目:百科 来源:网络整理
导读:背景 我正在构建一个应用程序,根据用户是否登录,在页面上显示不同的内容. (使用ng-if)我不希望根据登录状态将用户重定向到单独的路由. AngularJs – best way to limit access to ‘logged in’ users 我确实要检查服务器验证,以确保只有真正登录的用户可以
背景

我正在构建一个应用程序,根据用户是否登录,在页面上显示不同的内容. (使用ng-if)我不希望根据登录状态将用户重定向到单独的路由.
AngularJs – best way to limit access to ‘logged in’ users

我确实要检查服务器验证,以确保只有真正登录的用户可以修改,但我想阻止非用户查看某些内容.我不确定这样做的最佳方法是什么.现在我确定这很糟糕.

> AngularJS
> Rails 4

在我的静态页面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,因为任何人都可以更改窗口对象的状态.它不一定不那么安全,但它绝对不是一个好的解决方案.作为一般经验法则,避免全局变量.

这是我推荐的一种架构:

>与身份验证服务器通信的身份验证服务
>表示用户会话的会话工厂.您可能希望这可以保存用户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>

这似乎更复杂,但我喜欢它,因为它的模块化设计使其非常容易扩展和重用.代码没有经过测试,但我希望你能得到这个想法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读