我想使用非常简单的身份验证规则来保护路由。基本上,我有一个控制器,它读取我的自定义http标头并使用此标头值来检查用户是否在本地数据库中。如果我有一个用户,那么它是经过身份验证的。用户在后端处理一个简单的where子句。因此,如果用户未经过身份验证,我的目标是保护路由。
这是我的UsersController.cs
课程:
[Route("/api/[controller]")]
public class UsersController : Controller
{
private readonly IMapper mapper;
private readonly IUserRepository repository;
public UsersController(IMapper mapper, IUserRepository repository )
{
this.repository = repository;
this.mapper = mapper;
}
[HttpGet]
public async Task<IEnumerable<UserForDisplayDto>> GetAllUsers()
{
var headerValue = Request.Headers["customHeader"];
var person = headerValue.ToString();
var users = await repository.GetAllJhedUsers(person);
return mapper.Map<IEnumerable<User>, IEnumerable<UserForDisplayDto>>(users);
}
}
这是我的通讯repository
课程:
public async Task<IEnumerable<User>> GetAllJhedUsers(string id, bool includeRelated = true)
{
return await context.Users.Where(x => x.JHED_ID == id).ToListAsync();
}
我的AuthGuard
课程是:
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private userService: UserService,
private router: Router
) {}
canActivate(): Observable<boolean> | Promise<boolean> | boolean {
if (this.userService.isAuthenticated()) {
return true;
}
this.router.navigate(['/errorpage]);
return false;
}
}
我已将此AuthGuard
作为app.module.ts
添加到provider
类。
这是我需要提出抗议的路线:
{ path: 'members/members-list', component: MembersListComponent, canActivate: [AuthGuard] }
以下是isAuthenticated
中的user.service.ts
方法:
@Injectable()
export class UserService {
baseUrl = environment.apiUrl;
constructor(private http: Http) { }
getAllUsers() {
return this.http.get(this.baseUrl + 'users').map(res => res.json());
}
isAuthenticated() {
const user = this.http.get(this.baseUrl + 'users')..map(res => res.json());
return !!user;
}
}
问题是AuthGuard
不保护路由,当不在本地数据库中的用户访问该链接时。
任何帮助表示赞赏!
答案 0 :(得分:1)
user
将永远是一个可观察的对象,这是真实的,所以你总是会返回true。
如果你的服务返回一个数组,我想你会想要这个:
isAuthenticated(): Observable<bool> {
return this.http.get(this.baseUrl + 'users')
.map(res => res.json())
.map(users => !!users.length);
}
答案 1 :(得分:-1)
您必须订阅observable才能返回实际结果:
isAuthenticated() {
return this.http.get(this.baseUrl + 'users')
.map(res => res.json())
.Subscribe(users =>
{
return !!users;
});
}