当前位置: 首页 > 知识库问答 >
问题:

内存认证中的Spring Security性不起作用

吕淮晨
2023-03-14

我试图使用带有预定义用户id和密码的spring security实现内存身份验证。我使用基本的HTTP身份验证,并以“userid:password”的形式将用户id和密码组合作为头部发送(为了简单起见,我忽略了上述头部的编码)。

@RequestMapping(value = "/course", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
 public ResponseEntity<ApiResponse> addCourse(@RequestBody Course course) {
   return new ResponseEntity<ApiResponse>(new ApiResponse(HttpStatus.OK.value(), null), HttpStatus.OK);
 }
@Test
  public void testAddCourse() throws Exception {
    String inputJsonRequest = JacksonMapperUtil.convertObjectToJsonString(course);
    mockMvc.perform(MockMvcRequestBuilders.post("/course")
        .contentType(MediaType.APPLICATION_JSON)
        .content(inputJsonRequest)
        .header("jane_doe", "admin_password"))
        .andExpect(MockMvcResultMatchers.status().isOk())
        .andExpect(MockMvcResultMatchers.jsonPath("$.statusCode").value(HttpStatus.OK.value()));
  }
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .withUser("john_doe")
        .password("student_password")
        .authorities("ROLE_STUDENT_USER")
        .and()
        .withUser("jane_doe")
        .password("admin_password")
        .authorities("ROLE_OFFICE_ADMIN");
  }

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .withUser("john_doe")
        .password("student_password")
        .authorities("ROLE_STUDENT_USER")
        .and()
        .withUser("jane_doe")
        .password("admin_password")
        .authorities("ROLE_OFFICE_ADMIN");
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic()
        .and()
        .authorizeRequests()
        .antMatchers(HttpMethod.POST, "/course")
        .hasAuthority("ROLE_OFFICE_ADMIN")
        .antMatchers(HttpMethod.POST, "/student")
        .hasAnyAuthority("ROLE_OFFICE_ADMIN", "ROLE_STUDENT_USER")
        .antMatchers(HttpMethod.GET, "/**")
        .permitAll()
        .anyRequest()
        .authenticated()
        .and()
        .exceptionHandling()
        .accessDeniedHandler(accessDeniedHandler())
        .authenticationEntryPoint(authenticationEntryPoint());
  }

  @Bean
  RestAccessDeniedHandler accessDeniedHandler() {
    return new RestAccessDeniedHandler();
  }

  @Bean
  RestAuthenticationEntryPoint authenticationEntryPoint() {
    return new RestAuthenticationEntryPoint();
  }
}

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

  @Override
  public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e)
      throws IOException, ServletException {
    ApiResponse response = new ApiResponse(HttpStatus.UNAUTHORIZED.value(),
        "Authentication Failure-The user name and password combination is incorrect");
    OutputStream out = httpServletResponse.getOutputStream();
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValue(out, response);
    out.flush();
  }

AccessDenied处理程序实现类


@Component
public class RestAccessDeniedHandler implements AccessDeniedHandler {
  @Override
  public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e)
      throws IOException, ServletException {
    ApiResponse apiResponse = new ApiResponse(HttpStatus.FORBIDDEN.value(),
        "Authorization Failure-This user does not have the sufficient level of access");
    OutputStream out = httpServletResponse.getOutputStream();
    ObjectMapper mapper = new ObjectMapper();
    mapper.writeValue(out, apiResponse);
    out.flush();
  }

使用的maven依赖项:

Spring boot版本-2.2.1.发布

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

共有1个答案

狄子真
2023-03-14

您应该提供一个密码编码器,或者定义bean类似;

@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

或者在密码前面键入{noop},如下所示

.withUser("john_doe")
        .password("{noop}student_password")
 类似资料:
  • 年龄限制默认值不是由选择的,但是它与请求参数配合得很好。 YML文件 下面是带有请求参数Request的旧代码 下面是ModelAttribute请求的新代码

  • 我试图让一个元素向右对齐。我使用了flexbox,因为我发现最容易将文本和任何图标完美对齐。下面的代码片段是我正在做的一个示例。该代码在Firefox和Chrome中运行良好,但在IE中无法使用justify内容。我已经有了“-ms flex pack”,但它没有做任何事情。IE中的内容是左对齐的,而不是右对齐的。

  • 问题内容: 我的实体中有一个布尔型属性。这是我的注释: 但是效果并不理想。这是我作为生成表的结果得到的SQL代码: 我究竟做错了什么? 因此,当我尝试将此类的实例保存到数据库时,出现异常: 如果我删除财产: 因此在这种情况下,我可以保存创建的对象。但是仍然 没有设置默认值, 并且我在数据库中此字段的值中得到NULL。 有什么想法吗?如果重要,我会使用MySQL Server 5.1。我将非常感谢您

  • 因此,我一直很难通过Cucumber/Scala集成来降低依赖关系。我终于有了一个简单的步骤定义运行,但当我按control+空格键时,步骤定义列表不会显示在我的功能文件中。但是,当我运行特性文件时,它运行成功。 测试转轮 步骤定义文件 以下是一些与Cucumber/Scala相关的依赖关系

  • 我正在android应用程序中使用Firebase SDK进行手机身份验证OTP验证。这在调试版本上运行良好,但在发布版本上不起作用。 在Firebase项目中添加了我的调试SHA-1指纹。 在Firebase项目中添加了我的发布认证SHA-1指纹。 我还没有发布/发布构建到google play store。 提前谢谢

  • 问题内容: 我正在Ubuntu 13.04(Raring Ringtail)之上运行最新版本的Docker: 但是当我启动容器时 我没有看到任何限制,并且我的内核启用了cgroups内存限制: 我在这里想念什么明显的东西? 问题答案: 将不会显示它,因为这是通过cgroups强制执行的。而是可以在主机(容器外部)上使用和cgroup内存进行检查: 要查看它的内存不足,可以运行一些将使用比分配的内存