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我已经添加了它。请检查您是否将授权与身份验证混淆<代码>用户名
和密码
通常是识别(验证)用户所需的唯一内容。要让他们访问特定资源(如项目),您需要对他们进行授权。有关授权的一些提示可在此处找到: