SpringSecurity接口权控(权限控制)

本文介绍了如何在SpringBoot项目中,不使用复杂的RBAC机制,通过自定义过滤器和@PreAuthorize注解实现接口权限控制,以及如何与Controller配合测试。重点在于理解SpringSecurity的核心——过滤器机制。
摘要由CSDN通过智能技术生成

最近项目需要做“接口权限”控制,但不需要做RBAC (Role Based Access Control)这种大的业务。于是有下面的方案。

一、项目pom文件

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

二、过滤器及配置

1、过滤器功能:从请求头获取 “auth”的值,等于“1”,则放行。
2、安全配置使用默认配置
3、@EnableMethodSecurity 则是告诉spring容器,@PreAuthorize注解可生效

@Configuration
@EnableMethodSecurity
public class AuthFilter extends OncePerRequestFilter {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.build();
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = request.getHeader("auth");
        CustAuComp.flag = token.equals("1");
        filterChain.doFilter(request, response);
    }

}

三、自定义授权对象

“custAu”组件名,与后面controller授权注解“@PreAuthorize”对应

/**
 * 自定义授权对象
 */
@Component("custAu")
public class CustAuComp  {

    /**
     * 简单的放行开关
     */
    public static boolean flag = false;

    /**
     * 自定义的方法
     * @param elVal el表达式
     * @return true 放行
     */
    public boolean hasPermission(String elVal) {
        System.out.println("hasPermission "+elVal);
        return flag;
    }

}

四、Controller

@PreAuthorize(“@custAu.hasPermission(‘role1’)”)
custAu 与第三的组件名对应,hasPermission与其内的方法对应,role1是EL表达式

@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping("demo")
    @PreAuthorize("@custAu.hasPermission('role1')")
    public String genPubKey() {
        return System.currentTimeMillis()+" hello,world";
    }
    
}

五、测试

拦截是否通过与第二步有关
在这里插入图片描述

六、最后

SpringSecurity最近的更新速度蛮快的,网上资料看得晕头转向。

实际上,我们只需要明白它的核心是spring“过滤器”就好。

参考资料:参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*crzep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值