吐槽下若依(RuoYi)系统的权限系统(shiro和spring-security)

摘要:
spring-security以RuoYi-Vue为例,当前版本是3.1.0。然后是系统中很多地方用LoginUserloginUser=tokenService.getLoginUser来获取当前用户数据,这个需要再解析token,然后从redis缓存中读取的数据,不明白为什么不直接从SecurityUtils.getLoginUser()中获取,明明已经封装好方法了。为啥不直接用getAuthorities呢?

起因

有接触若依,目前是前后端分离版本是用的spring-security,不分离版本是用的shiro,两个权限都有些想吐槽的地方

shiro

RuoYi为例,当前是4.4.0版本,我们直接看realm的配置,在com.ruoyi.framework.shiro.realmdoGetAuthorizationInfo方法中:

    /**
     * 登录认证
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException
    {
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        String password = "";
        if (upToken.getPassword() != null)
        {
            password = new String(upToken.getPassword());
        }
        SysUser user = null;
        try
        {
            //这里
            user = loginService.login(username, password);
        }
        catch (CaptchaException e)
        {
            throw new AuthenticationException(e.getMessage(), e);
        }
        ...省略
        //就是这里
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
        return info;
    }

上方SimpleAuthenticationInfo的第二个参数直接将UsernamePasswordToken中的password传递过去了,但如果用shiro自身的逻辑的话,应该是将从数据库查询出来的user中的password传递过去,而且系统在ShiroConfig中压根没有配置HashedCredentialsMatcher凭证匹配器,所以shiro默认是用simpleCredentialsMatcher也就是密码会直接字符串比较不做任何md5等哈希加密来进行密码匹配,所以这里如果传递UsernamePasswordToken中的password那后续的assertCredentialsMatch(token, info)密码比较方法必然成功,也就是相当于把shiro自带的密码验证功能废掉了,但若依系统之所以还能正常运行,是因为它实现了自己的密码比较,就在上方的user = loginService.login(username, password)中。但真的有这个必要自己实现吗?个人感觉不是很好,因为很多初学者会参考这些系统来学习shiro的配置什么的,感觉会造成困扰。

spring-security

RuoYi-Vue为例,当前版本是3.1.0

  • 目前token采用的是jwt的方式,但令人费解的是,所有的token又在redis做了存储,以便于可以直接控制失效等,如果是redis中用黑名单的形式来剔除token的话还可以理解,但系统明显是所有的token都存储了,那这里用jwt的意义何在,还不如直接返回一个不重复的uuid作为token多好,不用每次都传递jwt的这么多数据,也不用额外解析jwt
  • 然后是系统中很多地方用LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest())来获取当前用户数据,这个需要再解析token,然后从redis缓存中读取的数据,不明白为什么不直接从SecurityUtils.getLoginUser()中获取,明明已经封装好方法了。
  • 然后是权限校验方面,我们先看UserDetail的实现类LoginUser
    /**
    * 登录用户身份权限
    * 
    * @author ruoyi
    */
    public class LoginUser implements UserDetails
    {
        private static final long serialVersionUID = 1L;
    
        ...省略
    
        /**
        * 权限列表(看这里)
        */
        private Set<String> permissions;
    
    ...省略
    
        public LoginUser(SysUser user, Set<String> permissions)
        {
            this.user = user;
            this.permissions = permissions;
        }
    
        ...省略
        //还有看这里
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities()
        {
            return null;
        }
    }
    
    
    这里明明有getAuthorities这个方面来设置权限,但偏偏不用,而是自己定义一个permissions来存放权限,然后导致@PreAuthorize("@ss.hasPermi('system:dict:list')")也只能能自定义了一个PermissionService来再实现hasPermi等方法,但这样有意义吗?为啥不直接用getAuthorities呢?同样会对初学者参考时造成困扰。

总结

以上就是吐槽点,若依系统本身还是不错的,而且每个作者都有自己的想法,希望越做越好吧。

免责声明:文章转载自《吐槽下若依(RuoYi)系统的权限系统(shiro和spring-security)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇R8500 MPv2 版本 刷梅林改版固件帆软—FineBI5.1忘记管理员登录密码及用户名下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Shiro授权及注解式开发

目的:   shiro授权   shiro注解式开发 Shiro授权 首先设计shiro权限表: 从图中我们也清晰的看出五张表之间的关系 ShiroUserMapper Set<String>getRolesByUserId(Integer uid); Set<String> getPersByUserId(In...

Shiro权限管理框架(四):深入分析Shiro中的Session管理

其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻。最后问题解决了,但我觉得我也是时候来做一波Shiro学习笔记了。 本篇是Shiro系列第四篇,Shiro中的过滤器初始化流程和实现原理。Shiro基于URL的权限...

Apache shiro如何实现一个账户同一时刻只有一个人登录

继承AuthorizingRealm类,重写方法doGetAuthenticationInfo /** * 认证(登录时调用) */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken to...

认证与Shiro安全框架

  本文内容均来自官网 1.简介 Apache Shiro是Java的一个安全框架。功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案。 实际上,Shiro的主要功能是管理应用程序中与安全相关的全部,同时尽可能支持多种实现方法。Shiro是建立在完善的接口驱动设计和面向对象原则之上的,支持各种自定义行...

shiro 框架基本讲解【转载】

shiro 框架基本讲解【转载】 什么是权限管理: 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问...

将 Shiro 作为一个许可为基础的应用程序 五:password加密/解密Spring应用

考虑系统password的安全,眼下大多数系统都不会把password以明文的形式存放到数据库中。 一把会採取下面几种方式对password进行处理 password的存储 “编码”存储 Shiro 提供了 base64和 16 进制字符串编码/解码的 API支持,方便一些编码解码操作。 Shiro内部的一些数据的存储/表示都使用了 base64和 16...