繁体   English   中英

如何使用 Spring 安全性进行 RESTful 登录 API?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM