Spring Boot / Spring Security中的错误401未经授权

Posted

技术标签:

【中文标题】Spring Boot / Spring Security中的错误401未经授权【英文标题】:Error 401 Unauthorized in spring boot / spring security 【发布时间】:2022-01-21 15:19:43 【问题描述】:

我添加了spring安全依赖,之后我启动了服务器,一切顺利。结果我得到了一个带有用户名和密码的表单,我输入 user 作为用户名和密码作为我在控制台中得到的那个,

Using generated security password: 8c3450f7-ab6c-419e-bd69-431ed336eeaa

但我总是得到用户名或密码不正确。

班级Security:

package security;

import org.springframework.http.HttpMethod;
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;

@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter
    
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .cors().and()
            .csrf().disable()
            .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/users")
            .permitAll()
            .anyRequest().authenticated();
                         
    

这是我尝试访问的链接http://localhost:8081/users

对我正在犯的错误有什么想法吗?

班级UserController:

RestController
@RequestMapping("/users")     // localhosr:8080/users
public class userController 
    @Autowired
    UserService userService;
    
    @GetMapping
    public String getUser() 
        return " get user was called ";
    
    
    @PostMapping
    public UserResponse createUser(@RequestBody UserRequest userRequest) 
        
        UserDto userDto = new UserDto();
        BeanUtils.copyProperties(userRequest, userDto);
        
        UserDto createUser = userService.createUser(userDto);
        UserResponse userResponse = new UserResponse();
        BeanUtils.copyProperties(createUser, userResponse);
        
        return userResponse ;
    
    
    @PutMapping
    public String updateUser() 
        return " update user was called ";
    
    
    @DeleteMapping
    public String deleteUser() 
        return " delete user was called ";
    

在失眠中,对于 Get 方法,我收到错误 401 Unauthorized

PS:我已经删除了 WebSecurity 类,我正在尝试访问 localhost:8081/users,我总是得到一个登录表单并且无法登录。

【问题讨论】:

.antMatchers(HttpMethod.POST, "/users") 只允许 POST 请求。您可能想使用类似antMatchers("/users") 的东西,它允许任何类型的请求。请注意,这将使/users 端点公开。 但我只想允许创建用户的 Post 请求,其他任何东西都需要登录,我尝试了 antMatchers("/users"),但它总是显示登录表单 @dEs12ZER 您发布问题的方式很难理解和阅读。请花点时间查看对您的帖子所做的修改,以了解未来需要注意的事项。您不应该依赖他人来使您的帖子清晰可见 【参考方案1】:

您将配置到所有端点,以通过“anyRequest().authenticated()”进行身份验证。所以,ofc 你会一直得到 401。

第一种方式

您可以一一配置所有需要的路径。喜欢:

.antMatchers("/to/path/**").isAuthenticated() 如果您需要身份验证。 .antMatchers("/to/path/**").isAnonymous()如果你需要no-auth,那么你将再次获得401 auth .antMatchers("/to/path/**").permitAll() 用户是否经过身份验证很重要 .antMatchers("/to/path/**").hasRole(...) 细化监管(未来)

第二种方式:

我建议使用它:“anyRequest().permitAll()”

在配置类上使用注解:

@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter
  ...

之后,您可以控制方法级别。示例:

@PreAuthorize("isAuthenticated()") // this isAuthenticated() see above first way
@PutMapping
public String updateUser() 
   ...

那些没有安全注解的是默认的 permitAll。

链接:https://www.baeldung.com/spring-security-method-security

旁注: 它也适用于 spring react (webflux),只需将 EnableGlobalMethodSecurity(...) 替换为:@EnableReactiveMethodSecurity。当然,设置有点不同,不过这个可以网上搜一下。

【讨论】:

以上是关于Spring Boot / Spring Security中的错误401未经授权的主要内容,如果未能解决你的问题,请参考以下文章

UnsatisfiedDependencyException:创建名为“securityConfig”的 bean 时出错

SpringSecurity基于数据库认证

spring security 1

Spring securiuty 过滤器

Spring Boot 学习例子

Spring Boot 2Spring Boot CLI