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