吐槽下若依(RuoYi)系统的权限系统(shiro和spring-security)
起因
有接触,⽬前是前后端分离版本是⽤的spring-security,不分离版本是⽤的shiro,两个权限都有些想吐槽的地⽅
shiro
以为例,当前是4.4.0版本,我们直接看realm的配置,在com.ruoyi.alm中doGetAuthorizationInfo⽅法中:
/**
* 登录认证
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws Authentication
Exception
{
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = Username();
String password = "";
if (Password() != null)
{
password = new Password());
}
SysUser user = null;
try
{
//这⾥
user = loginService.login(username, password);
}
catch (CaptchaException e)
{
throw new Message(), e);
}
shiro权限控制...省略
//就是这⾥
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
以为例,当前版本是3.1.0。
⽬前token采⽤的是jwt的⽅式,但令⼈费解的是,所有的token⼜在redis做了存储,以便于可以直接控
制失效等,如果是redis中⽤⿊名单的形式来剔除token的话还可以理解,但系统明显是所有的token都存储了,那这⾥⽤jwt的意义何在,还不如直接返回⼀个不重复的uuid作为token多好,不⽤每次都传递jwt的这么多数据,也不⽤额外解析jwt。
然后是系统中很多地⽅⽤LoginUser loginUser = Request())来获取当前⽤户数据,这个需要再解析token,然后从redis缓存中读取的数据,不明⽩为什么不直接从LoginUser()中获取,明明已经封装好⽅法了。
然后是权限校验⽅⾯,我们先看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呢?同样会对初学者参考时造成困扰。
总结
以上就是吐槽点,若依系统本⾝还是不错的,⽽且每个作者都有⾃⼰的想法,希望越做越好吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论