Django & DRF & Angular 101, 섹션 3.3
소멜
Authentification & JWT
Modules
소개하다.
:SET:une autre entitépour remplacer
on_delete
에 스티커를 붓다.데양고세리 호텔, DRF 호텔과 앙겔 호텔
l'authentification Angular avec Django는 UN 토큰인 JWT avec les Libraries drf JWT c ôté Django et@auth0/Angular JWT c ôtéfront
데양고 위병의 사용: 미슈 쿠슈하트 여사, 생활과 예술 도서관의 영사
이것은 격정이 충만한 모듈이다
모델레스
On va enrichir notre librairie, notamment sur les livres :
- ajouter un résumé
- modifier la contrainte de suppression
models.CASCADE
sur l'auteur : en effet, actuellement, la suppression d'un autre supprime également...tous ses livres, le ForeignKey
provoque cette action. On va, à la place, mettre NULL à la on_delete
lorsqu'un auteur est supprimé, on aura des livres orphelins mais au moins on les conserve !
class Book(TimeStampedModel):
name = models.CharField(max_length=100, null=False, blank=False, db_index=True)
summary = models.TextField(null=True, blank=True)
nb_pages = models.IntegerField()
author = models.ForeignKey(Author,
related_name='books',
null=True,
on_delete=models.SET_NULL)
enabled = models.BooleanField(default=True, help_text='disponible ou non')
def __str__(self):
return '{} : {}'.format(self.name, self.author)
le
이 책의 작자는 때가 낀 작자이다
python3 manage.py makemigrations --name 'book_upgrade_s
ummary_author' && python3 manage.py migrate
이것은 허가를 받지 않은 새로운 집단이다
오콘 단체와 허가 없이 성모원 고문과 평론가들은 미추를 사용하지 않았다.
만약 충분한 허가가 있다면 당신의 생활에 지원/수정/지원/자문을 제공하여 당신의'관리'팀을 당신의 생활과 사업의 지도자로 만들 수 있습니다.
모든 사람은 가정 수업이 있고, 우리 학생들은 모두 행정 수업이 있으며, 우리 학생들은 모두 후방 수업이 있다...사용자, 단체 및 라이센스의 각도 유형입니다.
고급 관리자(플랫폼/관리자), 팀원, 외부 팀원'gestionnaire'및livres와Auters 지역의 변호사
그룹: Ajouter
사용자 및 rôles: 사용자 및 그룹 Django .
세트 강변의 바세라 거리에서 뿔로 물을 주고 뿔로 물을 준다.
JWT
La méthode d'authentification qui s'est imposée depuis quelques années avec les SPA ou les applications mobiles est basée sur le token .
JWTétant unJWT은 세 가지로 구성되어 있다. 제목이다.유효 하중.서명하다.
models.CASCADE
sur l'auteur : en effet, actuellement, la suppression d'un autre supprime également...tous ses livres, le ForeignKey
provoque cette action. On va, à la place, mettre NULL à la on_delete
lorsqu'un auteur est supprimé, on aura des livres orphelins mais au moins on les conserve !
class Book(TimeStampedModel):
name = models.CharField(max_length=100, null=False, blank=False, db_index=True)
summary = models.TextField(null=True, blank=True)
nb_pages = models.IntegerField()
author = models.ForeignKey(Author,
related_name='books',
null=True,
on_delete=models.SET_NULL)
enabled = models.BooleanField(default=True, help_text='disponible ou non')
def __str__(self):
return '{} : {}'.format(self.name, self.author)
ummary_author' && python3 manage.py migrate
세트 강변의 바세라 거리에서 뿔로 물을 주고 뿔로 물을 준다.
JWT
La méthode d'authentification qui s'est imposée depuis quelques années avec les SPA ou les applications mobiles est basée sur le token .JWTétant unJWT은 세 가지로 구성되어 있다. 제목이다.유효 하중.서명하다.
예를 들어, 타사 , 타사api token auth puis saisir le login and mot de passe défini pour gest1
aura comme résultat에서 JSON 형식으로 정보를 제공하여 참고로 제공
{
"pk": 1587895563,
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imdlc3QxIiwiaWF0IjoxNTg3ODk1NTYzLCJleHAiOjE1ODc5MDk5NjMsInVzZXJfaWQiOjMsIm9yaWdfaWF0IjoxNTg3ODk1NTYzfQ.zBPgmxxbTKbg6_2cFEdOTg1G3JOk0QIhRlEam8EU7AA",
"user": {
"id": 3,
"username": "gest1",
"email": "[email protected]",
"is_superuser": false,
"is_staff": false
},
"refresh_url": "/api-token-refresh/",
"token_verify_url": "/api-token-verify/"
}
인증 프로세스:Authorization: Bearer token
잠재원소 détecter l'Usiliateur côdjangoapr eélela token 애플리케이션 엔클로저
export function tokenGetter(): string {
return localStorage.getItem('token');
}
imports: [
// ...
JwtModule.forRoot({
config: {
tokenGetter,
whitelistedDomains: ['localhost:4200', 'plateform'],
blacklistedRoutes: [],
skipWhenExpired: true,
}
}),
// ...
]
Unschéma simple du flux(프리스대학cet 우수L'objectif est d'utilisé l'API d'authentification pour obtenir un jeton JWT
@auth0/angular jwt Ajutera automatiquementètous les appels API l'entète 라이센스(유엔 Http Interceptor를 통해)를 연결하면 "interprétera DRF pour déterminer sil'use a les droits grèce aux"
tokenGetter()
로 표시됩니다.익명
standard du W3C
En mode connectéavec le compte gest1 gestionnaire
drf-jwt
http://plateform 각도 인증
article 코트디부아르 전선.도서관 서비스부permission_classes
는 노틀 타체 도서관에 서비스를 제공하고 기호화폐 JWT에 소급 서비스를 제공하며 API에 자동 주사 서비스를 제공한다JwtHelperService
(감사는 도서관 서비스)서비스 권한 수여 서비스에서 로그인과 로그아웃은 모두 유효하며 각종 실용 도구(연결, 영패 획득, 영패 사용 등)를 사용할 수 있다.
서비스 승인 서비스
로컬 저장소에서 권한 수여자와 사용자의 사용권과 사용권의 대상은 @auth0/angular jwt pourra ainsi Retroverce token gr –ceála Fontion
Authorization: Bearer token
vu précédemment입니다.tokenGetter
우리의 서비스는 차세대 연결이고 그 구성 부분은 간단하다.
@Injectable({ providedIn: 'root' })
export class AuthService {
private user: User;
private url = `${environment.baseUrl}/api-token-auth/`;
private userSource = new ReplaySubject<User>(1);
userActivate$ = this.userSource.asObservable();
constructor(private http: HttpClient,
private jwtService: JwtHelperService) {
}
/**
* Authentification /api-token-auth/
* @param {UserAuthent} user : l'utilisateur a connecté
* @return any dont token
*/
logon(user: UserAuthent): Observable<any> {
const headers = new HttpHeaders({
'Content-Type': 'application/json', Accept: 'application/json'
});
return this.http
.post(this.url, { username: user.username, password: user.password }, {headers})
.pipe(map(dataJwt => this._authenticated(dataJwt)));
}
/**
Déconnexion, on supprime tout ce qui est relatif au connecté et son
token
*/
logout() {
localStorage.removeItem('token');
localStorage.removeItem('user');
}
isAuthenticated() {
return !this.jwtService.isTokenExpired();
}
/**
* Stockage du token et de quelques informations user
* @param data
* @private
*/
private _authenticated(data: any): User {
localStorage.setItem('token', data.token);
localStorage.setItem('user', JSON.stringify(data.user));
this.userSource.next(data.user as User);
return data;
}
}
구성 요소 Banière de connexion
이 부분에서 우리는 연결된 반니에, 데넬, 부톤 상소위원회
userActivate$
와 서비스 작성자 서비스센터(que l'On a cré,au retour si tout est bon,Redrige vers la page d'accueil)를 보았다.연결하는 과정에서 유엔의 정보는 고정되어 있고 연결의 정확한 페이지에 나타난다.On utilisera le module
@auth0/angular-jwt
login() {
this.loading = true;
this.authService.logon(this.model)
.pipe(finalize(() => this.loading = false))
.subscribe(data => {
if (data.token) {
this.router.navigate(['/']);
}
},
error => {
this.loading = false;
if (error instanceof HttpErrorResponse && error.status === 400) {
const message = error.error.non_field_errors[0];
this.message = {
message, label: '',
color: 'red', icon: 'error'
};
} else {
throw error;
}
}
);
}
HttpInterceptor
인증
(이것은 진정한 노선의 계속과 충전)과 잠재 요소(이것은 전형적인 충전 모듈이다).
우리는 지도적인 지도 방침을 제정해야 한다. 이것은 지도적인 지도 방침이자 지도적인 지도 방침이다.
위병지휘지휘지휘:지휘logon()
테스트는 지휘를 연결하는 테스트로 관찰할 수 없는 isGestionnaire()
당신true
테스트의 결과입니다.J'ususe lefalse
enécoutant le SubjectUserGroupsService
,chaque connexion and donc le nouveau connecté,je peux tester son groupe d'appartance.
@Injectable({ providedIn: 'root'})
export class GestionnaireGuard implements CanLoad, CanActivate {
constructor(private userGrpService: UserGroupsService) {
}
canLoad(route: Route): Observable<boolean> {
return this.isGestionnaire();
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.isGestionnaire();
}
private isGestionnaire(): Observable<boolean> {
return new Observable<boolean>(observer => {
this.userGrpService.connecte$.subscribe(connecte => {
observer.next(this._gestionnaire(connecte));
observer.complete();
}
);
});
}
private _gestionnaire(connecte: UserGroups) {
return this.userGrpService.hasRole(connecte, roles.gestionnaire) ||
this.userGrpService.hasRole(connecte, roles.admin);
}
}
경호원이 없으면 충분합니다. 저희는 내무부,ici와 관리부서의 노선에서 사용할 수 있습니다.
응용 프로그램.경로ts,화이팅
// ...
const appRoutes: Routes = [
{
path: '',
children: [
{path: '', component: BooksListComponent},
{path: 'gestion', loadChildren: () => import('./gestion/gestion.module').then(m => {
return m.GestionModule; }), canLoad: [GestionnaireGuard], canActivate: [GestionnaireGuard]}
]
},
{path: '**', component: NotFoundComponent},
];
// ...
etcé 모듈 제스처, 제스처 루트.모듈이것은 간단한 방법으로 모듈의 제스처를 통해 노선을 제어할 수 있고, 로드 지연을 통해 실현할 수 있다
// ...
const routes: Routes = [
{
path: '',
canLoad: [GestionnaireGuard], canActivate: [GestionnaireGuard],
children: [
{path: 'book/edit', component: BookEditComponent},
{path: 'author/edit', component: AuthorEditComponent}
]
}
];
// ...
경비원은 연결과 허가된 노선을 통해'vues'구역을 통제한다.
경비원
Les guards vont nous permettre de restreindre l'accès aux routes suivant des règles de gestion sur des rôles, à l'aide de 1 ou 2 interfaces : CanActivate(비용 차이): 사용료 신청 비용의 경제적 손실은'페이지'를 예로 들 수 있다.Cela peut servir aussiá는 응용 프로그램 구성 요소의 일부입니다.
Dans notre Appliance, aura les 모듈 suivants:
@Injectable({ providedIn: 'root'})
export class GestionnaireGuard implements CanLoad, CanActivate {
constructor(private userGrpService: UserGroupsService) {
}
canLoad(route: Route): Observable<boolean> {
return this.isGestionnaire();
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.isGestionnaire();
}
private isGestionnaire(): Observable<boolean> {
return new Observable<boolean>(observer => {
this.userGrpService.connecte$.subscribe(connecte => {
observer.next(this._gestionnaire(connecte));
observer.complete();
}
);
});
}
private _gestionnaire(connecte: UserGroups) {
return this.userGrpService.hasRole(connecte, roles.gestionnaire) ||
this.userGrpService.hasRole(connecte, roles.admin);
}
}
// ...
const appRoutes: Routes = [
{
path: '',
children: [
{path: '', component: BooksListComponent},
{path: 'gestion', loadChildren: () => import('./gestion/gestion.module').then(m => {
return m.GestionModule; }), canLoad: [GestionnaireGuard], canActivate: [GestionnaireGuard]}
]
},
{path: '**', component: NotFoundComponent},
];
// ...
// ...
const routes: Routes = [
{
path: '',
canLoad: [GestionnaireGuard], canActivate: [GestionnaireGuard],
children: [
{path: 'book/edit', component: BookEditComponent},
{path: 'author/edit', component: AuthorEditComponent}
]
}
];
// ...
Dans notre Appliance, aura les 모듈 suivants:
능숙하다 손짓
이러한 모듈의 각도 방향은 충전기의 각도 방향과 다르다. 그들의 조합(그리고 변화무쌍한 조합)은 특정한 시간, 하나의 용어, 특정한 시간, 특정한 시간, 특정한 시간, 특정한 시간, 특정한 시간, 특정한 시간, 특정한 시간, 특정한 시간, 특정한 시간, 로드 지연
모듈
권장 사항:
les livres 편집:편집/억제
작가: 편집/억압
이것은 전형적인 소화 때의 일종이다.
단스의 손짓, 우리 오룡의 손짓.모듈이것은 구성 요소를 이용하여 노선 계획을 하는 방법이다.모듈손짓을 하다.
원칙적인 응용 노선에서 저는 당신의 수요(생활과 감독의 요구에 따라)와 적당한 위병, 우리의aurons dans 응용 프로그램을 만족시킬 수 있습니다.경로두 번째 부분은 제스처: dès qu'une route sur/gesting est appelée(/gestion/author/edit et/gestion/book/edit), le module gestion.모듈est chargée(즉, 출처와 비용)
시공 허가: 노선=[
{
경로: "",
어린이: [
{경로: \", 구성 요소: BookListComponent},
{path:'authent',component:LoginComponent},
{path:'login',component:LoginComponent},
{path:'books',component:bookslist component},
{path:'authors',component:AuthorsListComponent},
{path:'gestion', loadChildren:()=>import('./gestion/gestion.module'). 그리고(m=>{
m.GestionModule;} 반환
]
},
{경로:'**', 구성 요소:NotFoundComponent},
];
Les composants de consultations (liste et affichage) font partis du module principal (app.module) car ils sont utilisés soit par les utilisateurs qui consultent mais aussi par les gestionnaire.
Nous aurons alors une déclaration simple pour les routes app.routing.ts, ici la route / et les routes books ou authors
const appRoutes: Routes = [
{
path: '',
children: [
{path: '', component: BooksListComponent},
{path: 'authent', component: LoginComponent},
{path: 'login', component: LoginComponent},
{path: 'books', component: BooksListComponent},
{path: 'authors', component: AuthorsListComponent},
{path: 'gestion', loadChildren: () => import('./gestion/gestion.module').then(m => {
return m.GestionModule; })}
]
},
{path: '**', component: NotFoundComponent},
];
영어 4급 시험 문장.
Dans un prochaine 기사, nous irons beaucoup plus loin sur le composant'데이터 테이블'은 colonnes와 세포 동력학을 필터하는 조언을 제시하고 일정한 재료를 제공했다.
Reference
이 문제에 관하여(Django & DRF & Angular 101, 섹션 3.3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/zorky/django-drf-angular-101-partie-3-3-10fa
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
const appRoutes: Routes = [
{
path: '',
children: [
{path: '', component: BooksListComponent},
{path: 'authent', component: LoginComponent},
{path: 'login', component: LoginComponent},
{path: 'books', component: BooksListComponent},
{path: 'authors', component: AuthorsListComponent},
{path: 'gestion', loadChildren: () => import('./gestion/gestion.module').then(m => {
return m.GestionModule; })}
]
},
{path: '**', component: NotFoundComponent},
];
Reference
이 문제에 관하여(Django & DRF & Angular 101, 섹션 3.3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zorky/django-drf-angular-101-partie-3-3-10fa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)