[英]How do I build a full-functional RESTful API using Java Spring security
[英]How to do a RESTful login API using Spring Security?
我刚刚开始使用 Spring 安全性并实施了 HTTP 基本身份验证,效果很好。
现在我想创建登录端点并尝试获取经过身份验证的用户。
我不确定我必须为此使用什么? 我确实在网上阅读了很多东西,但不确定从哪里开始。
任何提示将不胜感激!
这是用于身份验证的代码。
安全配置.java
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(encodePWD());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http
.csrf().disable();
http
.httpBasic()
.and()
.authorizeRequests()
.antMatchers("/rest/**").permitAll()
.and()
.authorizeRequests()
.antMatchers("/secure/**").hasAnyRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll();
}
@Bean
public BCryptPasswordEncoder encodePWD() {
return new BCryptPasswordEncoder();
}
}
CustomUserDetailsService.java
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
CustomUserDetails userDetails = null;
if(user != null){
userDetails = new CustomUserDetails();
userDetails.setUser(user);
}else{
throw new UserNotFoundException("User doesn't exist with this username: " + username);
}
return userDetails;
}
}
CustomUserDetails.java
@Getter
@Setter
public class CustomUserDetails implements UserDetails {
private User user;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getRoles().stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRole())).collect(Collectors.toSet());
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
更新
我正在使用 Postman 发送我的数据,如 JSON
{
"username": "admin",
"password": "admin35"
}
在传统的 MVC Spring Boot 应用程序中,Spring Security 将检查SecurityContextHolder
以获取身份验证信息。 如果找不到,那么您将被重定向到登录页面。
对于 REST API 端点,服务器不会发送典型的登录表单。 您将从客户端(AngularJS、ReactJS、VueJs、iOS 应用程序等)的表单中收集凭据,并将凭据发布到端点以检索用户信息。 例如,下面对用户进行认证,然后将认证后的用户信息返回给客户端。
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@GetMapping("/user")
public ResponseEntity<UserResponse> getUser(@AuthenticationPrincipal DmsUserDetails dmsUser) {
logger.info("User " + dmsUser.getFirstName() + " " + dmsUser.getLastName() + " logged in.");
UserResponse user = new UserResponse();
user.setUserId(dmsUser.getUserId());
user.setFirstName(dmsUser.getFirstName());
user.setLastName(dmsUser.getLastName());
user.setEmail(dmsUser.getUsername());
return ResponseEntity.ok(user);
}
客户端将跟踪用户是否登录,并在每个后续请求中传递 cookie 或令牌。
在这种情况下,我将端点命名为/user
,但如果您愿意,也可以将其命名为/login
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.