编程语言
首页 > 编程语言> > java-如何在Spring Boot中将RESTful与基本身份验证一起使用

java-如何在Spring Boot中将RESTful与基本身份验证一起使用

作者:互联网

Helllo,我将RESTful与基本身份验证结合使用,并且此代码是RestController的一部分:

@GetMapping("/jpa/users/{username}/goals")
public List<Goal> getAllGoals(@PathVariable String username) {
    userId = getUserIdFromUsername(username);
    return goalJpaRepository.findByUserId(userId); 
}

public Long getUserIdFromUsername(String username) {
    User user = userJpaRepository.findByUsername(username);
    userId = user.getId(); 
    return userId;
}

而且我有一个问题,例如我正在使用Postman来为特定用户检索目标,如下所示:

http://localhost:8080/jpa/users/john/goals带有GET请求

然后,我对用户名john使用基本身份验证,并为此用户名使用密码,然后收到john的目标.

之后,如果我对此链接http://localhost:8080/jpa/users/tom/goals进行GET请求,我将收到tom的目标,但是此时我已与john登录,因此john可以看到他的目标,也可以看到tom的目标.

问题是如何在RestController中访问登录用户名,因为我想执行以下操作:

if (loginUsername == username) {
    return goalJpaRepository.findByUserId(userId);
} 

return "Access denied!";

所以我想知道是否可以从HTTP标头访问登录用户名?

谢谢!

更新-是的,框架是Spring Boot,我也将Spring Security与Dao Authentication一起使用,因为我想从MySQL数据库中获取用户.无论如何,我不是Spring Security的专家.

现在,我了解了如何在控制器方法中使用Principal,但是对于这种特定情况,我不知道如何使用Spring Security.我应该如何实施?例如,用户john应该只看到和修改他的目标.

春季安全配置:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import com.dgs.restful.webservices.goaltrackerservice.user.MyUserDetailsService;

@Configuration
@EnableWebSecurity
public class SpringSecurityConfigurationBasicAuth extends WebSecurityConfigurerAdapter {

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    private MyUserDetailsService userDetailsService;

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider
          = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        authProvider.setPasswordEncoder(bCryptPasswordEncoder());
        return authProvider;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .antMatchers("/allusers").permitAll()
                .anyRequest().authenticated()
                .and()
            // .formLogin().and()
            .httpBasic();
        }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }
}

解决方法:

请注意,您目前不做任何安全保护.

正如@Matt所说,“这取决于您使用的框架”.但是我想你正在使用弹簧.然后,您应该查看spring-securuty模块的文档.

基本上,您可以将经过身份验证的用户注入到您的方法参数中:

   @GetMapping("/jpa/users/{username}/goals")
   public List<Goal> getAllGoals(@PathVariable String username, Principal principal) {
     if ( username.equals(principal.getName()) ) {
       userId = getUserIdFromUsername(username);
       return goalJpaRepository.findByUserId(userId); 
     } else {
       throw new SomeExceptionThatWillBeMapped();
     }
   } 

但是spring-security和许多框架提供了更好的模式来管理安全性.

标签:spring-rest,rest,restful-authentication,basic-authentication,java
来源: https://codeday.me/bug/20191024/1923684.html