Java 如何为登录添加额外的spring安全字段

Java 如何为登录添加额外的spring安全字段,java,spring,spring-boot,spring-mvc,spring-security,Java,Spring,Spring Boot,Spring Mvc,Spring Security,我想使用用户名、密码和项目(附加字段)实现用户登录/注册。它正在使用用户名和密码,但无法实现添加额外字段(项目),因为我是spring security的新手 我可以使用电子邮件、用户名、密码和项目注册 我在UserPrincipal中添加了Project,如下代码所示 我需要实现自定义身份验证以在登录期间添加项目,但我无法确定如何进一步进行。有人能帮忙吗?我已经检查了其他解决方案,但没有找到实现方法。如果我理解正确,您只需在登录/注册期间向用户添加此项目信息即可 正如@HarshVerma所指

我想使用用户名、密码和项目(附加字段)实现用户
登录/注册。它正在使用
用户名和密码
,但
无法实现添加额外字段(项目)
,因为我是spring security的新手

  • 我可以使用
    电子邮件、用户名、密码和项目注册
  • 我在
    UserPrincipal
    中添加了
    Project
    ,如下代码所示

  • 我需要实现
    自定义身份验证以在登录期间添加项目
    ,但我无法确定如何进一步进行。有人能帮忙吗?我已经检查了其他解决方案,但没有找到实现方法。

    如果我理解正确,您只需在登录/注册期间向用户添加此
    项目
    信息即可

    正如@HarshVerma所指出的,在Spring中,您只需要登录和密码就可以进行身份验证

    您可以将用户的
    项目作为JWT声明实施:

    Jwts.builder()
         .setSubject(Long.toString(userPrincipal.getId()))
         .claim("project", myProject)
         .setIssuedAt(new Date())
         .setExpiration(expiryDate)
         .signWith(SignatureAlgorithm.HS512, jwtSecret)
         .compact();
    
    然后将其检索以进行相应授权:

    Claims claims = new DefaultClaims();
        try{
            claims = Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(jwt).getBody();
        } catch (SignatureException e){
            // signature exception
        }
    

    对身份验证控制器进行以下更改。在上下文中设置
    身份验证之前,请检查
    用户名
    是否拥有
    项目
    。但这感觉有点不舒服:

    
    public class AuthController {
    ...
    @PostMapping("/signin")
        public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) {
    
            Authentication authentication = authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            loginRequest.getUsernameOrEmail(),
                            loginRequest.getPassword()
                            )
                    );
    
            // checking if user owns the project
            if (usernameOwnsProject(username, project)) {
             SecurityContextHolder.getContext().setAuthentication(authentication);
              String jwt = tokenProvider.generateToken(authentication);
              return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
            } else {
              // throw error 
            }
            
        }
    ...
    }
    
    
    公共类授权控制器{
    ...
    @邮戳(“/签名”)
    公共响应身份验证者(@Valid@RequestBody LoginRequest LoginRequest){
    Authentication=authenticationManager.authenticate(
    新用户名PasswordAuthenticationToken(
    loginRequest.getUsernameOrEmail(),
    loginRequest.getPassword()
    )
    );
    //检查用户是否拥有该项目
    if(用户名ownsproject(用户名,项目)){
    SecurityContextHolder.getContext().setAuthentication(身份验证);
    字符串jwt=tokenProvider.generateToken(身份验证);
    返回ResponseEntity.ok(新的JwtAuthenticationResponse(jwt));
    }否则{
    //抛出错误
    }
    }
    ...
    }
    
    你没有提到你的JWT配置,这在这里很重要…@k-wasilewski我已经添加了它。请检查您是否将授权与身份验证混淆<代码>用户名
    和密码
    通常是识别(验证)用户所需的唯一内容。要让他们访问特定资源(如项目),您需要对他们进行授权。有关授权的一些提示可在此处找到: