使用http与角卫兵相处

时间:2018-04-09 21:04:18

标签: angular model-view-controller .net-core

我想使用非常简单的身份验证规则来保护路由。基本上,我有一个控制器,它读取我的自定义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 保护路由,当不在本地数据库中的用户访问该链接时。 任何帮助表示赞赏!

2 个答案:

答案 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;
              });
}