Saya memiliki aplikasi AngularJS yang dibuat dengan menggunakan yeoman, grunt dan bower.
Saya memiliki halaman login yang memiliki pengontrol yang memeriksa otentikasi. Jika kredensial benar, saya mengalihkan ke beranda.
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";
}
}
});
Di halaman rumah saya miliki
<span class="user-info">
<small>Welcome,</small>
{{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>
Dalam loginController
, saya memeriksa info masuk dan jika berhasil, saya menetapkan objek pengguna di pabrik layanan. Saya tidak tahu apakah ini benar atau tidak.
Yang saya butuhkan adalah, Ketika pengguna login, Ini menetapkan beberapa nilai dalam objek pengguna sehingga semua halaman lain bisa mendapatkan nilai itu.
Setiap kali terjadi perubahan rute, controller harus memeriksa apakah pengguna masuk atau tidak. Jika tidak, harus dialihkan ke halaman login. Juga, jika pengguna sudah masuk dan kembali ke halaman, itu harus pergi ke halaman rumah. Pengontrol juga harus memeriksa kredensial di semua rute.
Saya pernah mendengar tentang cookies, tetapi saya tidak tahu bagaimana menggunakannya.
Banyak contoh yang saya lihat tidak begitu jelas dan mereka menggunakan semacam peran akses atau sesuatu. Saya tidak menginginkan itu. Saya hanya ingin filter login. Adakah yang bisa memberi saya ide?
routeChangeStart
panggilan balik Anda harus memeriksa apakah lokasi itu sebenarnya "/ login" dan biarkan itu:if ( $location.path() === "/login" ) return;
Berikut ini adalah solusi lain yang mungkin, menggunakan
resolve
atribut$stateProvider
atau$routeProvider
. Contoh dengan$stateProvider
:Access
menyelesaikan atau menolak janji tergantung pada hak pengguna saat ini:UserProfile
salinan properti pengguna saat ini, dan melaksanakan$hasRole
,$hasAnyRole
,$isAnonymous
dan$isAuthenticated
metode logika (ditambah$refresh
metode, dijelaskan kemudian):Auth
bertanggung jawab untuk meminta server, untuk mengetahui profil pengguna (terkait dengan token akses yang dilampirkan pada permintaan misalnya):Server diharapkan untuk mengembalikan objek JSON tersebut saat meminta
GET api/auth
:Akhirnya, ketika
Access
menolak janji, jika menggunakanui.router
,$stateChangeError
acara akan dipecat:Jika menggunakan
ngRoute
,$routeChangeError
acara akan dipecat:Profil pengguna juga dapat diakses di pengontrol:
UserProfile
kemudian berisi properti yang dikembalikan oleh server saat memintaGET api/auth
:UserProfile
perlu di-refresh ketika pengguna masuk atau keluar, sehinggaAccess
dapat menangani rute dengan profil pengguna baru. Anda dapat memuat ulang seluruh halaman, atau meneleponUserProfile.$refresh()
. Contoh saat masuk:sumber
Cara paling sederhana untuk mendefinisikan perilaku khusus untuk rute individual akan cukup mudah:
1)
routes.js
: buat properti baru (sepertirequireAuth
) untuk rute yang diinginkan2) Di pengontrol tingkat atas yang tidak terikat ke elemen di dalam
ng-view
(untuk menghindari konflik dengan sudut$routeProvider
), periksa apakahnewUrl
memilikirequireAuth
properti dan bertindak sesuaisumber
routes.js
.Saya menulis posting beberapa bulan yang lalu tentang cara mengatur registrasi pengguna dan fungsi login dengan Angular, Anda dapat memeriksanya di http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and -Login-Example.aspx
Saya memeriksa apakah pengguna masuk dalam
$locationChangeStart
acara tersebut, ini adalah app.js utama saya yang menunjukkan ini:sumber
Saya merasa cara ini paling mudah, tapi mungkin itu hanya pilihan pribadi.
Saat Anda menentukan rute login Anda (dan rute anonim lainnya; mis: / daftar, / logout, / refreshToken, dll.), Tambahkan:
Jadi, sesuatu seperti ini:
Anda tidak perlu menentukan "allowAnonymous: false", jika tidak ada, dianggap salah, di cek. Di aplikasi tempat sebagian besar URL diautentikasi paksa, ini kurang berfungsi. Dan lebih aman; jika Anda lupa menambahkannya ke URL baru, hal terburuk yang dapat terjadi adalah URL anonim dilindungi. Jika Anda melakukannya dengan cara lain, menetapkan "requireAuthentication: true", dan Anda lupa menambahkannya ke URL, Anda membocorkan halaman sensitif kepada publik.
Kemudian jalankan ini di mana pun Anda merasa paling sesuai dengan desain kode Anda.
sumber
app.js
loginServices.js
sessionServices.js
loginCtrl.js
sumber
Anda bisa menggunakan
resolve
:Dan, fungsi tekad:
Firebase juga memiliki metode yang membantu Anda menginstal pengamat, saya sarankan menginstalnya di dalam
.run
:sumber
Misalnya aplikasi memiliki dua pengguna bernama ap dan auc. Saya melewati properti tambahan untuk setiap rute dan menangani perutean berdasarkan data yang saya dapatkan di $ routeChangeStart.
Coba ini:
app.js:
sumber
Semua telah menyarankan solusi besar mengapa Anda khawatir tentang sesi di sisi klien. Maksud saya ketika status / url berubah, saya kira Anda sedang melakukan panggilan ajax untuk memuat data untuk tempelate.
Sekarang data ajax dikembalikan oleh server menggunakan api apa pun. Sekarang intinya mulai berlaku, kembalikan tipe pengembalian standar menggunakan server sesuai dengan status pengguna yang login. Periksa kode kembali itu dan proses permintaan Anda di controller. Catatan: - Untuk controller yang tidak memerlukan panggilan ajax secara native, Anda dapat memanggil permintaan kosong ke server seperti ini
server.location/api/checkSession.php
dan ini adalah checkSession.phpDi sisi klien, pengontrol dalam atau melalui layanan apa pun seperti yang ditunjukkan dalam jawaban lain
Catatan: - Saya akan memperbarui lebih banyak besok atau di masa depan
sumber
Anda harus memeriksa otentikasi pengguna di dua situs utama.
'$routeChangeStart'
panggilan baliksumber