基于 Angular 角色的身份验证密钥斗篷和 Spring Boot

Posted

技术标签:

【中文标题】基于 Angular 角色的身份验证密钥斗篷和 Spring Boot【英文标题】:Angular role based authentification keycloak and SpringBoot 【发布时间】:2021-03-05 12:51:28 【问题描述】:

我想在 Angular 前端和 SpringBoot 后端之间设置身份验证。 我有一个配置了 SpringBoot 和功能的 SpringBoot 身份验证服务器。 Front 可以对 Keycloak 进行身份验证,并可以访问 SpringBoot API。

问题是我想知道如何知道用户是否已登录以显示登录按钮。

第二件事是我希望显示一些页面,而其他页面不显示,这取决于用户的角色。

如果您知道的话,作为奖励...我想根据用户的角色显示 DOM 的某些部分。

(这是我第一次设置这个系统...感谢您的帮助) Keycloak 和 Spring 方面没有问题,连接正常,重定向到 Angular 也正常。承载保存OK

app.component.ts

import  Component  from '@angular/core';
import  OAuthService, NullValidationHandler, AuthConfig  from 'angular-oauth2-oidc';

@Component(
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
)
export class AppComponent 
  
  constructor(private oauthService: OAuthService) 
    this.configure();
  
authConfig: AuthConfig = 
    issuer: 'http://localhost:8081/auth/realms/api-team', // Keycloak Server
    redirectUri: window.location.origin + "/api-team", // My SpringBoot
    clientId: 'api-team-client-angular',
    scope: 'openid profile email offline_access api-angular',
    responseType: 'code',
    // at_hash is not present in JWT token
    // disableAtHashCheck: true,
    showDebugInformation: true
  
  
  public login() 
    this.oauthService.initLoginFlow();
  
  
  public logoff() 
    this.oauthService.logOut();
  
  
  private configure() 
    this.oauthService.configure(this.authConfig);
    this.oauthService.tokenValidationHandler = new  NullValidationHandler();
    this.oauthService.loadDiscoveryDocumentAndTryLogin();
  

只是一个测试.. app.component.html

<router-outlet>
  <button class="btn btn-default" (click)="login()">
    Login
  </button>
  <button class="btn btn-default" (click)="logoff()">
    Logout
  </button>
    <app-loader></app-loader>
</router-outlet>

我的一个路由器

export const MaterialRoutes: Routes = [
    
        path: '',
        children: [
            // 
            //     path: 'services-namespace',
            //     component: ServicesProjetComponent,
            //     data: 
            //         title: "Composants d'un projet",
            //         urls: [
            //              title: 'Dashboard', url: '/dashboard1' ,
            //              title: "Composants d'un projet" 
            //         ]
            //     
            // ,
            
                path: 'namespaces',
                component: ProjetsComponent,
                data: 
                    title: "Liste des Projets",
                    urls: [
                         title: 'Dashboard', url: '/dashboard1' ,
                         title: "Liste de Projets" 
                    ]
                
            

【问题讨论】:

【参考方案1】:

您需要添加的只是 Angular 防护(可能还有身份验证服务)。

我已经设置了一个关于 Open ID 的最小 mono-repo for a meetup,具有非常相似的堆栈:spring RESTful API(好吧它是 servlet,不是响应式的)、Angular 前端和 Keycloak 授权服务器。

我建议你克隆并破解它。对于 Angular 特定部分,请仔细查看:

Angular guard 以及 routes definition 中的用法 authentication service

【讨论】:

以上是关于基于 Angular 角色的身份验证密钥斗篷和 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 keycloak 构建基于 spring 的项目进行身份验证

如何制作和使用基于 JWT 角色的身份验证?

代表客户端验证密钥斗篷不记名令牌

在 Angular 2/4 应用程序上对用户进行身份验证后的动态角色和权限

Angular 2 和 JWT 身份验证 (Auth0)

添加声明以访问令牌密钥斗篷