刷新页面后,我无法注销。我认为问题在于获取当前用户的方法或检查用户管理的方法。
管理员授权守卫。服务ts
export class AdminAuthGuardService implements CanActivate {
constructor(
private router: Router,
private userService: UserService,
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.checkLogin();
}
checkLogin(): Observable<boolean> {
return this.userService.getCurrentUser().pipe(
map(user => {
if (user) {
const isUserAdmin = this.userService.isRoleAdmin();
if (isUserAdmin) {
return true;
} else {
this.router.navigate(['/forbidden']);
return false;
}
} else {
this.router.navigate(['/login']);
return false;
}
})
);
}
}
使用者服务ts
export class UserService { currentUser!: User | null; private usersUrl = `${SERVER_API_URL}/api/user`; private apiServerUrl = environment.apiBaseUrl; constructor(private http: HttpClient) { } getCurrentUser(): Observable { return this.http.get(`${this.usersUrl}/current-user`); } isRoleAdmin(): boolean { if (this.currentUser) { return this.currentUser.authorities.some((authority: string) => authority === Authority.ADMIN); } else { return false; } } isRoleUser(): boolean { if (this.currentUser) { return this.currentUser.authorities.some((authority: string) => authority === Authority.USER); } else { return false; } } isRoleDeleter(): boolean { if (this.currentUser) { return this.currentUser.authorities.some((authority: string) => authority === Authority.DELETER); } else { return false; } } getStudentsData(userId: number): Observable{ return this.http.get(`${this.apiServerUrl}/api/user/edit/${userId}`); } updateUser(profesor: Profesors[], userId: number): Observable{ return this.http.put(`${this.apiServerUrl}/api/user/update/${userId}`, profesor); } }
登录名。组成部分ts
export class LoginComponent implements OnInit { authenticating = false; // to show loading loginFailed = false; // to show login failed message userCredentials!: UserCredentials; private loggedIn = new BehaviorSubject(localStorage.getItem("isLoggedIn") === "true"); constructor( private loginService: LoginService, private router: Router, private userService: UserService ) { } ngOnInit(): void { this.userCredentials = new UserCredentials(); } login() { this.authenticating = true; this.loginFailed = false; this.loginService.authenticate(this.userCredentials).subscribe( (jwtToken: JwtToken) => this.successfulLogin(jwtToken), () => this.loginFailed = true ).add(() => this.authenticating = false); } successfulLogin(jwtToken: JwtToken) { localStorage.setItem('token', jwtToken.token); // store token value to localstorage this.userService.getCurrentUser().subscribe((currentUser: User) => this.userService.currentUser = currentUser); this.router.navigate(['/home']); } isUserLoggedIn(): boolean { return !this.userService.currentUser; } }
使用者模型ts
export class User { id: number; username: string; firstName: string; lastName: string; authorities: string[]; constructor(id: number, username: string, firstName: string, lastName: string, authorities: string[]){ this.id = id; this.username = username; this.firstName = firstName; this.lastName = lastName; this.authorities = authorities; } }
我通常会做的一件事是将ID保存在localStorage上。
当用户登录时,它会将id
保存在localStorage上,当您尝试从该用户获取任何内容时,只需将id
获取到localStorage。如果您想注销,只需从那里删除id
,它就可以正常工作了!
我从来没有遇到过这样的问题,它总是对我有用!
注意:我只在测试某事时使用这种方式,而不是当它被认为是实时的时候
我将从一些重构开始:
移动用户类中的角色检查方法:
export class User {
id: number;
username: string;
firstName: string;
lastName: string;
authorities: string[];
constructor(user?: Partial<User>) {
Object.assign(this, user);
}
isRoleAdmin = () => {
return this.authorities.some(authority => authority === Authority.ADMIN);
}
isRoleUser = () {
return this.authorities.some(authority => authority === Authority.USER);
}
isRoleDeleter = () {
return this.authorities.some(authority => authority === Authority.DELETER);
}
}
然后,您可以从服务中删除角色方法,并确保调用用户类构造函数,否则它将不是用户类的实例,它将只是一个普通对象:
export class UserService {
currentUser!: User | null;
private usersUrl = `${SERVER_API_URL}/api/user`;
private apiServerUrl = environment.apiBaseUrl;
constructor(private http: HttpClient) {}
getCurrentUser(): Observable<User> {
return this.http.get<User>(`${this.usersUrl}/current-user`).pipe(
map(user => new User(user))
);
}
getStudentsData(userId: number): Observable {
return this.http.get(`${this.apiServerUrl}/api/user/edit/${userId}`);
}
updateUser(profesor: Profesors[], userId: number): Observable {
return this.http.put(
`${this.apiServerUrl}/api/user/update/${userId}`,
profesor
);
}
}
然后,可以这样实现防护:
export class AdminAuthGuardService implements CanActivate {
constructor(private router: Router, private userService: UserService) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> {
return this.checkLogin();
}
checkLogin(): Observable<boolean> {
return this.userService.getCurrentUser().pipe(
map((user) => {
if (!user) {
this.router.navigate(["/login"]);
return false;
}
const isAllowed = user.isRoleAdmin();
if (!isAllowed) {
this.router.navigate(["/forbidden"]);
}
return isAllowed;
})
);
}
}
考虑这个例子,其中主应用程序是两个模块的消费者:一个提供电子邮件服务,另一个提供日志服务。 app/email/email.service.ts app/email/email.module.ts providers: [ EmailService ], }) export class EmailModule { } 电子邮件服务api需要一些由字符串api-config标识的配置设置,由DI
本文向大家介绍Java Web 如何避免 SQL 注入?相关面试题,主要包含被问及Java Web 如何避免 SQL 注入?时的应答技巧和注意事项,需要的朋友参考一下 使用预处理 PreparedStatement。 使用正则表达式过滤掉字符中的特殊字符。
问题内容: 在下面的示例代码中,表名称是一个输入参数。在这种情况下,如何避免使用进行SQL注入。下面是示例代码,我尝试使用它来避免它,但是它不起作用。谁能告诉我如何纠正它? 输出:打印消息: 所有输入参数将完全替换,并删除一行。请让我知道如何处理这种情况。 问题答案: 您可以将表名包含在 但是,如果使用两部分命名约定,例如,则必须添加其他解析,因为这将导致: 无效的对象名称[dbo.tablena
什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的
我使用springcloud config server在生产环境中按计划在运行时刷新我的应用程序属性。我的日程表每两周一次,没有任何问题。 我的应用程序在Kubernetes cloud上运行在多个吊舱上。吊舱随时可能崩溃或重新启动。当pod崩溃/重新启动时,它在应用程序启动时从配置服务器和存储库中获取最新的属性文件,而不是等待下一个计划的刷新周期。 任何解决以上问题的建议将不胜感激。
问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)