[解決済み] AngularJS- 各ルートとコントローラでのログインと認証
質問
私は、yeoman、grunt、bowerを使用して作成したAngularJSのアプリケーションを持っています。
ログインページがあり、そのページには認証チェックを行うコントローラがあります。認証が正しい場合は、ホームページにリルートされます。
app.js
'use strict';
//Define Routing for app
angular.module('myApp', []).config(['$routeProvider', '$locationProvider',
function($routeProvider,$locationProvider) {
$routeProvider
.when('/login', {
templateUrl: 'login.html',
controller: 'LoginController'
})
.when('/register', {
templateUrl: 'register.html',
controller: 'RegisterController'
})
.when('/forgotPassword', {
templateUrl: 'forgotpassword.html',
controller: 'forgotController'
})
.when('/home', {
templateUrl: 'views/home.html',
controller: 'homeController'
})
.otherwise({
redirectTo: '/login'
});
// $locationProvider.html5Mode(true); //Remove the '#' from URL.
}]);
angular.module('myApp').factory("page", function($rootScope){
var page={};
var user={};
page.setPage=function(title,bodyClass){
$rootScope.pageTitle = title;
$rootScope.bodylayout=bodyClass;
};
page.setUser=function(user){
$rootScope.user=user;
}
return page;
});
LoginControler.js
'use strict';
angular.module('myApp').controller('LoginController', function($scope, $location, $window,page) {
page.setPage("Login","login-layout");
$scope.user = {};
$scope.loginUser=function()
{
var username=$scope.user.name;
var password=$scope.user.password;
if(username=="admin" && password=="admin123")
{
page.setUser($scope.user);
$location.path( "/home" );
}
else
{
$scope.message="Error";
$scope.messagecolor="alert alert-danger";
}
}
});
トップページには
<span class="user-info">
<small>Welcome,</small>
{{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>
で
loginController
ログイン情報を確認し、成功したらサービスファクトリーにユーザーオブジェクトを設定します。これが正しいかどうかは分かりませんが。
私が必要とするのは、ユーザーがログインしたときに、他のすべてのページがその値を取得できるように、ユーザーオブジェクトに何らかの値を設定することです。
ルートが変更されるたびに、コントローラはユーザがログインしているかどうかをチェックする必要があります。もしそうでなければ、ログインページにリルートしなければなりません。また、ユーザーがすでにログインしている状態でページに戻ってきた場合は、トップページに移動するようにします。コントローラは、すべてのルートで認証情報をチェックする必要があります。
ng-cookieのことは聞いたことがありますが、どのように使えばいいのかわかりません。
私が見た多くの例は、あまり明確ではなく、アクセスロールのようなものを使っていました。私はそんなのいらない。私はログインフィルタが欲しいだけです。 どなたかアイデアを教えていただけませんか?
どのように解決するのですか?
ユーザーの状態はサービスに保存され、runメソッドではルートが変更されたときに監視し、ユーザーが要求されたページにアクセスすることが許可されているかどうかをチェックします。
app.run(['$rootScope', '$location', 'Auth', function ($rootScope, $location, Auth) {
$rootScope.$on('$routeChangeStart', function (event) {
if (!Auth.isLoggedIn()) {
console.log('DENY');
event.preventDefault();
$location.path('/login');
}
else {
console.log('ALLOW');
$location.path('/home');
}
});
}]);
サービスを作成する必要があります(名前は
Auth
このオブジェクトは、ユーザーオブジェクトを処理し、ユーザーがログインしているかどうかを知るためのメソッドを備えています。
サービス :
.factory('Auth', function(){
var user;
return{
setUser : function(aUser){
user = aUser;
},
isLoggedIn : function(){
return(user)? user : false;
}
}
})
あなたの
app.run
を聞く必要があります。
$routeChangeStart
イベントが発生します。ルートが変更されるとき、ユーザーがログインしているかどうかがチェックされます (
isLoggedIn
メソッドで処理する必要があります)。ユーザーがログインしていない場合、リクエストされたルートはロードされず、適切なページ(あなたの場合はログイン)にリダイレクトされます。
は
loginController
は、ログインを処理するためにログインページで使用されるべきです。これは
Auth
サービスを使用して、ユーザがログインしているかどうかを設定します。
loginController :
.controller('loginCtrl', [ '$scope', 'Auth', function ($scope, Auth) {
//submit
$scope.login = function () {
// Ask to the server, do your job and THEN set the user
Auth.setUser(user); //Update the state of the user in the app
};
}])
メインコントローラから、ユーザーの状態が変化したときにリダイレクトで対応することができます。
.controller('mainCtrl', ['$scope', 'Auth', '$location', function ($scope, Auth, $location) {
$scope.$watch(Auth.isLoggedIn, function (value, oldValue) {
if(!value && oldValue) {
console.log("Disconnect");
$location.path('/login');
}
if(value) {
console.log("Connect");
//Do something when the user is connected
}
}, true);
関連
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] angular-routeとangular-ui-routerの違いは何ですか?
-
[解決済み] AngularJSのコントローラからビューにHTMLを挿入する
-
[解決済み] あるAngularJSのコントローラが別のコントローラを呼び出すことはできますか?
-
[解決済み] AngularJSでコントローラを2回実行する場合の対処法
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
-
[解決済み】AngularJS ui-router ログイン認証
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】Uncaught ReferenceError。Reactが定義されていない
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み】JS ファイルが net::ERR_ABORTED 404 (Not Found) を取得する)
-
[解決済み】TypeError:res.jsonは関数ではありません。
-
[解決済み】SyntaxError: 期待された式が、'<'を得た。
-
[解決済み】TypeError: AngularJSで未定義のプロパティ'get'を読み取れない