使用spring security的基于角色的授权

Posted

技术标签:

【中文标题】使用spring security的基于角色的授权【英文标题】:role based authorization using spring security 【发布时间】:2020-06-16 21:04:19 【问题描述】:

我正在使用 jwt 使用带有 spring security 的 spring boot 应用程序。

登录用户具有管理员权限,他正在尝试删除用户,它正在接受以下代码

角度:-

    delete(userId: number) 
        debugger;
        return this.http.delete(`/api/v1/admin/deleteUser/$userId`);
    

SpringSecurityConfig.java

@Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable()      
         .headers()
          .frameOptions().sameOrigin()
          .and()
            .authorizeRequests()
             .antMatchers("/api/v1/authenticate", "/api/v1/register","/api/v1/basicauth").permitAll()
                .antMatchers("/").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")//only admin can access this
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/home")
                .failureUrl("/login?error")
                .permitAll()
                .and()
            .logout()
             .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
             .logoutSuccessUrl("/login?logout")
             .deleteCookies("my-remember-me-cookie")
                .permitAll()
                .and()
            .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

            // Add a filter to validate the tokens with every request
            http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    

controller.java

@DeleteMapping(path = "/admin/deleteUser/userId")
    public ResponseEntity<?> deleteUser(HttpServletRequest request,@PathVariable int userId)  

        authenticationService.deleteUser(userId);

        return ResponseEntity.ok((""));
    

但在我使用ROLE_USER 登录的应用程序用户中,他也可以访问该方法,如何将访问限制为仅限ROLE_ADMIN

【问题讨论】:

请尝试.antMatchers("/api/v1/admin/**").hasRole("ADMIN") 我会将其转换为答案 :) 【参考方案1】:

修改 ant 匹配器以匹配预期的 URL。

.antMatchers("/api/v1/admin/**").hasRole("ADMIN") //only admin can access this

【讨论】:

以上是关于使用spring security的基于角色的授权的主要内容,如果未能解决你的问题,请参考以下文章

基于 Spring Boot / Spring Security 角色的授权无法正常工作 [重复]

Spring Security 基于角色的授权问题

217.Spring Boot+Spring Security:基于内存的角色授权

Spring Security应用开发(21)基于方法的授权使用@Secured注解

218.Spring Boot+Spring Security:基于内存数据库的身份认证和角色授权

219.Spring Boot+Spring Security:基于MySQL数据库的身份认证和角色授权