spring security 自定义URL权限和权限校验异常

本文介绍如何在Spring Security中实现自定义URL权限验证和权限校验异常处理。通过数据库动态配置url资源权限,系统启动时加载权限列表,用户登录时获取角色列表。在请求访问时对比权限进行判断。自定义配置包括实现接口加载资源权限,自定义决策管理器和投票器。同时,针对匿名用户和已认证用户的权限异常进行了自定义处理。
摘要由CSDN通过智能技术生成

Spring Security使用FilterSecurityInterceptor过滤器来进行URL权限校验,实际使用流程大致如下:

  1. 通过数据库动态配置url资源权限
  2. 系统启动时,通过FilterSecurityInterceptor滤器到数据库加载系统资源权限列表
  3. 用户登陆时通过自定义的UserDetailsService加载当前用户的角色列表
  4. 当有请求访问时,通过FilterSecurityInterceptor对比系统资源权限列表和用户资源权限列表(在用户登录时添加到用户信息中)来判断用户是否有该url的访问权限。
自定义URL权限验证需要在FilterSecurityInterceptor自定义的配置项
  1. securityMetadataSource:实现FilterInvocationSecurityMetadataSource接口,在实现类中加载资源权限,并在filterSecurityInterceptor中注入该实现类。
  2. accessDecisionManager:通过实现AccessDecisionManager接口自定义一个决策管理器,判断是否有访问权限。判断逻辑可以写在决策管理器的决策方法中,也可以通过投票器实现,除了框架提供的三种投票器还可以添加自定义投票器。自定义投票器通过实现AccessDecisionVoter接口来实现。
    下是Spring Security官方文档提供的一个图,其展示了与基于投票的AccessDecisionManager实现相关的类
    在这里插入图片描述
权限校验异常需要在ExceptionTranslationFilter自定义的配置项

1、AuthenticationEntryPoint 用来解决匿名用户访问无权限资源时的异常
2、AccessDeineHandler 用来解决登陆认证过的用户访问无权限资源时的异常

demo代码如下:
1、自定义securityMetadataSource从数据库加载动态配置的角色url资源权限

@Component
public class MyFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
   
    private Map<RequestMatcher, Collection<ConfigAttribute>> allRoleSource = new HashMap<>();
    public MyFilterInvocationSecurityMetadataSource(){
   
        //模拟从数据库加载角色URL权限信息
        Map<String,String> urlRoleMap = new HashMap<String,String>(){
   {
   
            put("/open/**","ROLE_ANONYMOUS");
            put("/home","ADMIN,USER");
            put("/admin/**","ADMIN");
            put("/user/**","ADMIN,USER");
        }};
        Map<RequestMatcher, Collection<ConfigAttribute>> loadRequestMap = new HashMap<>();
        for(Map.Entry<String,String> entry:urlRoleMap.entrySet()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值