1

ruoyi接口权限校验 - allworldg

 2 years ago
source link: https://www.cnblogs.com/allworldg/p/ruoyi-learn-1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

此文章属于ruoyi项目实战系列

ruoyi系统在前端主要通过权限字符包含与否来动态显示目录和按钮。为了防止通过http请求绕过权限限制,后端接口也需要进行相关权限设计。

@PreAuthorize使用

由于对@PreAuthorize原理还不够深入了解,所以此处只粗浅讲解在ruoyi项目是如何应用的。
在请求调用接口前,被@preAuthorize注解的接口需要首先通过验证。通过注解参数value()返回值truefalse来判断是否有权限。

public @interface PreAuthorize {  
    String value();  
}

Ruoyi并没有使用原生的Spel表达式,而是使用了自定义的PermissionService类,通过其中自定义方法hasPermi(String Permission) 来进行权限判断。注解使用举例:@PreAuthorize("@ss.hasPermi('system:menu:list')")

public boolean hasPermi(String permission)  
{  
    if (StringUtils.isEmpty(permission))//用注解就必须有permission值  
    {  
        return false;  
    }  
    LoginUser loginUser = SecurityUtils.getLoginUser();  
    if (StringUtils.isNull(loginUser) ||
     CollectionUtils.isEmpty(loginUser.getPermissions()))  
    {  
        return false;  
    }  
    return hasPermissions(loginUser.getPermissions(), permission);

private boolean hasPermissions(Set<String> permissions, String permission)  
{  
    return permissions.contains(ALL_PERMISSION) ||
     permissions.contains(StringUtils.trim(permission)); //判断是否持有"所有权限”字符,或者持有该权限 
}

接口权限校验流程

粗略用两个例子来讲解前端请求如何经过后端接口权限校验。

Login匿名请求

bd6a709cecd882b179a8342ad64fd209.png
  1. Login请求路径是/login,在过滤器链中被AnnoymousAuthenticationFilter添加匿名authentication到Spring上下文里。由于/login请求在SecurityConfig.java里设置成匿名请求,所以可以成功到达SysLoginController

  2. 调用SysLoginService.login方法,关键的一行命令:

    Authentication authentication = authenticationManager  
    .authenticate(new UsernamePasswordAuthenticationToken(username, password));
    

    authenticationManager.authenticate()是钩子方法,在AbstractUserDetailsAuthenticationProvider中实现,会根据传入的token类型来自动选择,此处UsernamePasswordAuthenticationToken将由DaoAuthenticationProvider来处理(不清楚的话可以前后打两个断点看调用栈)。

  3. DaoAuthenticationProvider中可以看到关键的一行:

    UserDetails loadedUser = this.getUserDetailsService()
    .loadUserByUsername(username);
    

    这会调用我们自定义实现的UserDetailsServiceImpl#loadUserByUsername方法(如流程图所示),获得user信息。至于为什么会使用自定义方法,因为在SecurityConfig.java中进行了配置

    @Override  
    protected void configure(AuthenticationManagerBuilder auth) throws Exception  
    {  
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());  
    }
    
  4. 生成token,然后返回。

已登录请求

已登录请求流程较简单,在流程图里的some filters里会通过自定义的JwtAuthenticationFilter,其中会通过token获得user信息,然后装入Spring的上下文,方便提取使用。

曾纠结踩坑的点

由于对SpringSecurity较陌生,虽然功能强大,但其复杂性也是大大提高,所以调试项目的同时翻看了很多入门博客文章,其中都不约而同的提到了UsernamePasswordAuthenticationFilter,可是我在实战项目中反复调试都没有看到这个过滤器的调用。

原因:Security配置文件需要添加httpSecurity.formLogin()启用表单登录才会使用该filter。查看项目使用的所有filter可以使用以下测试代码:


class RuoYiApplicationTest {  
    @Autowired  
    private FilterChainProxy filterChainProxy;  
    @Test  
    public void test() {  
        List<SecurityFilterChain> filterChains = filterChainProxy.getFilterChains();  
        for(SecurityFilterChain sfc:filterChains){  
            for(Filter filter:sfc.getFilters()){  
                System.out.println(filter.getClass().getName());  
            }  
        }  
    }  
}

Recommend

  • 8
    • www.oschina.net 2 years ago
    • Cache

    ruoyi-react

    ruoyi-react首页、文档和下载 - 快速开发平台 - OSCHINA - 中文开源技术交流社区 若依(Ruoyi-React)是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 前端采用React、Ant Design Pro、TypeScript。 后端采用Spr...

  • 2
    • blog.51cto.com 2 years ago
    • Cache

    ruoyi-cloud 实施部署

    ruoyi-cloud 实施部署 推荐 原创 flyfish225 2022-03-08 17:33:09...

  • 6

    为什么要搭建个人博客 尽管已经有很多成型的在线博客平台供大家使用(csdn,博客园,掘金等),但是它们都有一些很明显的弊端,例如账号以及博客内容受到监管,所有权不属于作者本人,对于博客平台的功能diy自由度很低。 ...

  • 4

    若依(RuoYi )权限管理设计 萌猫他爸 互联网从业者/大数据架构师/全栈开发者

  • 4

    原文 一些IDE提供“方法断点”的功能,可以让断点调试看起来非常简洁,然而在调试过程中我们会发现调试反应时间很长,调试器的性能大大降低。在本文中,我会简单解释方法...

  • 3

    优维低代码:Permissions 权限校验 EASYOPS_youwei · 大约2小时之...

  • 1

    2023-04-19 17:30阅读: 58评论: 0推荐: 3 Kubuesphere部署Ruoyi(二):部署kubesphere

  • 6

    2023-04-20 14:11阅读: 55评论: 0推荐: 0 Kubuesphere部署Ruoyi(三):持久化存储配置

  • 5

    一日一技:分布式系统的低成本权限校验机制 2023-11-29 86 1.2k 4 分钟 经常关注未闻Code的同学都知道,我做了一个叫做

  • 5

    1、业务背景 由于业务流程的复杂性,用户往往只具备部分功能的权限,导致在操作自开发程序时出现权限问题。例如前台限制了用户对销售订单的修改,而自开发功能中又涉及单据修改,此时一味限制权限,则无法正常使用功能。 2、使用RFC跳过权限

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK