如何使用 Angular 添加角色

Posted

技术标签:

【中文标题】如何使用 Angular 添加角色【英文标题】:How can I add roles using Angular 【发布时间】:2020-08-11 16:54:56 【问题描述】:

我遇到了这个问题,当我使用角度形式时无法添加角色,而 JSON 测试邮递员寄存器在前端角色中正确添加,如果有人知道如何解决这个问题,我会很高兴。 提前谢谢你

用户.控制器

 @PostMapping("/signup")
    public ResponseEntity<?> registerUser(@Valid @RequestBody RegistrationForm signUpRequest) 
       if (utilisateurRepository.existsByUsername(signUpRequest.getUsername())) 
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: Username is already taken!"));
        

        if (utilisateurRepository.existsByEmail(signUpRequest.getEmail())) 
            return ResponseEntity
                    .badRequest()
                    .body(new MessageResponse("Error: Email is already in use!"));
        

        Set<String> strRoles = signUpRequest.getRoles();

        Set<Role> roles = new HashSet<>();

        if (strRoles == null) 
            Role userRole = roleRepository.findByName(ERole.ROLE_USER)
                    .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
            roles.add(userRole);

         else 
            strRoles.forEach(role -> 
                switch (role) 
                    case "admin":
                        Role adminRole = roleRepository.findByName(ERole.ROLE_ADMIN)
                                .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                        roles.add(adminRole);

                        break;


                    default:
                        Role aideRole = roleRepository.findByName(ERole.ROLE_AIDESOIGNANTE )
                                .orElseThrow(() -> new RuntimeException("Error: Role is not found."));
                        roles.add(aideRole);
                
            );
        
        // Create new user's account
        Utilisateur user = new Utilisateur(signUpRequest.getUsername(),
                signUpRequest.getEmail(),
                passwordEncoder.encode(signUpRequest.getPassword()), signUpRequest.getTelephone(), roles);

        user.setRoles(roles);
        utilisateurRepository.save(user);

        return ResponseEntity.ok(new MessageResponse("User registered successfully!"));
    

Authentication.Service Angular

 register(user): Observable<any> 
    return this.http.post(AUTH_API + 'signup', 
      username: user.username,
      email: user.email,
      telephone: user.telephone,
      role: user.role,
      password: user.password
    , httpOptions);

Register.Html

 <div class="form-group">
          <label for="role">Role</label>
          <input
            type="text"
            class="form-control"
            name="role"
            [(ngModel)]="form.role"
            required
            #role="ngModel"
          />

        </div>

Register.ts

 onSubmit() 
    this.authService.register(this.form).subscribe(
      data => 
        console.log(data);
        this.isSuccessful = true;
        this.isSignUpFailed = false;
      ,
      err => 
        this.errorMessage = err.error.message;
        this.isSignUpFailed = true;
      
    );
  

【问题讨论】:

谁在调用你的register 方法?显示代码。 这里是注册组件我编辑我的问题你现在可以检查它 【参考方案1】:

问题是角度形式设置了一个角色,而您的后端期待roles(复数形式)。您可以通过以下方式解决:

onSubmit() 
  // use rest operator to get a rest object without role
  const role, ...rest = this.form;

  // build userData, containing the role collected above
  // SignUpData is declared on Authentication.service
  const userData: SignUpData = ...rest, roles: [role];

  // use the userData in your request
  this.authService.register(userData).subscribe(
    data => 
      console.log(data);
      this.isSuccessful = true;
      this.isSignUpFailed = false;
    ,
    err => 
      this.errorMessage = err.error.message;
      this.isSignUpFailed = true;
    
  );

Authentication.Service Angular

export interface SignUpData 
  username: string;
  email: string;
  telephone: string;
  roles: string[];
  password: string;


@Injectable(providedIn: 'root')
export class AuthenticationService 

  ...
  register(user: SignUpData): Observable<any> 
    return this.http.post(AUTH_API + 'signup', user, httpOptions);
  
  ...

【讨论】:

我刚刚修复了答案中的前两行。根据您的打字稿配置,它会给您一条错误消息。 角色仍然添加为 ROLE_USER,即角色为空 那个对象...this.form...是您的控制还是您的数据?你是如何声明/使用它的? 浏览器的开发工具上有什么?能否提供表单数据? 我刚刚注意到您的 register 方法正在撤消我刚刚在回答中所做的事情。我也会修复注册方法。

以上是关于如何使用 Angular 添加角色的主要内容,如果未能解决你的问题,请参考以下文章

在Angular中->如何使用基于角色的访问权限检查用户是不是具有权限,并将角色保存在数据库中

如何根据用户角色Angular 4显示/隐藏元素

MSAL Angular:如何从 JWT 令牌中检索用户角色?

Angular 2 和 Spring Kerberos

如何防止服务器响应被用户修改?

如何在angular2中使用添加类属性