在 angular material 中用密码保护网页的最简单方法

most simple way to password protect a web page in angular material

我有一个关于如何使用密码保护网页的问题。 我使用 angular material 创建了一个网页,该网页将与 back-end 服务对话以查询信息。我还添加了一个管理员 sub-page 来进行网站配置。

我想用密码保护管理页面。 这种保护可以是一个非常简单的安全功能,不需要任何复杂的东西。 只是一个只有少数人知道的令牌,一旦他们输入有效令牌,管理页面就会显示。

我看了几个方法:

  1. .htaccess 和 .htpassword
  2. 将 java 脚本作为 header 嵌入 admin.component.html
  3. angular路由器link认证

1 和 2 对我不起作用 3 似乎对我的要求有点矫枉过正。

知道如何制作一个简单的密码保护网页吗? 此外,如果我必须使用 3,它将保护任何页面 re-routed 到管理页面。 但是如果我直接输入www.mysite.com/admin,它还会被保护吗?

我会使用 auth guards。

尝试查看用户:https://angular-authguard-jwt-duxyen.stackblitz.io/users

你不能,在你登录之前它会受到保护。

我们在用户路由上设置了 authGuard。

const routes: Routes = [
  { path: 'users', component: UsersComponent, canActivate: [AuthGuard] }
];

这就是授权什么是可见的,什么是不可见的。如果用户不能激活,自己折腾到/login.

@Injectable()
export class AuthGuard implements CanActivate {

  constructor(private _authService: AuthService, private router: Router){}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
      if(this._authService.loggedIn()){
        return true;
      }else{
        this.router.navigate(['/login']);
        return false;
      }
  }
}

授权服务 returns true/falsecanActivate 请求时。 true/false 取决于用户是否在他们的机器上存储了“secretToken”。

@Injectable()
export class AuthService {

  constructor() { }

  loggedIn(){
    let hasToken = false;
    if (localStorage.getItem('token') == 'secretToken'){
      hasToken = true;
    }
    return hasToken;
  }

  getToken(){
    return localStorage.getItem('token');
  }

}

如果用户通过身份验证可以访问我们的 /users 路由,我们使用将令牌存储到 localStorage 来跟踪。

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css'],
})
export class LoginComponent implements OnInit {
  loginUserData: User = { username: '', password: '' };
  allowedUsername = 'Mike';
  allowedPassword = '123';
  constructor(private _auth: AuthService, private router: Router) {}
  ngOnInit() {}

  loginUser() {
    if (
      this.loginUserData.username == this.allowedUsername &&
      this.loginUserData.password == this.allowedPassword
    ) {
      console.log('login success');
      localStorage.setItem('token', 'secretToken');
      localStorage.setItem('is_admin', 'true');
      this.router.navigate(['/home']);
    }
  }
}

export interface User {
  username: string;
  password: string;
}

使用令牌是非常常见的客户端身份验证。在我们的例子中,令牌是 hard-coded 但如果你想将其扩展到实际的身份验证过程,你可以。为简单起见,我删除了它(提示:google JWT 令牌,如果您感兴趣的话)。

基本上在登录后,我们在客户端localStorage 上放置一个key/value 对。 key 是令牌,value 是“scretToken”。一旦用户第一次成功登录,我们就把它放在那里。然后我们将用户重定向到 /users url。到达 /users 我们的 authGuard 开始,检查客户端是否在他们的机器上有令牌“scretToken”。如果他们有,他们可以看到内容。如果没有,他们被扔回/login

因为我们将令牌存储在 localStorage 中,即使用户刷新或更改选项卡,他们仍然经过身份验证。如果他们手动清除浏览数据,则令牌将被删除。如果他们使用我们的注销按钮注销,我们也会从 localStorage 中删除令牌。

在这里登录:https://angular-authguard-jwt-duxyen.stackblitz.io/login

用户名:Mike,密码:123

工作示例:https://stackblitz.com/edit/angular-authguard-jwt-duxyen?file=src%2Fapp%2Flogin%2Flogin.component.ts