如何解决如何使用Spring Security做一个RESTful登录API?
我刚刚开始使用Spring安全性,并且实现了可以正常工作的HTTP基本身份验证。
现在,我想创建登录端点并尝试获取经过身份验证的用户。
我不确定该用什么?我确实在网上阅读了很多东西,但不确定从哪里开始。
任何提示将不胜感激!
这是用于身份验证的代码。
SecurityConfiguration.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;
}
}
更新
我正在使用邮递员发送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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。