开发Java应用项目的时候,安全管理通常来讲是必不可少的功能。常用的安全管理框架有Apache Shiro和Spring Security,那么作为一名开发人员的话,该如何选择自己的权限管理框架呢?
首先我们来看一看两者的区别。
Apache Shiro是一个强大且易用的Java安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密等功能。他的API也非常易于理解的API,因此,对于初学者来说,非常容易上手。
它的特点包括:
· 易于理解的 Java Security API;
· 简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory等);
· 对角色的简单的签权(访问控制),支持细粒度的签权;
· 支持一级缓存,以提升应用程序的性能;
· 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;
· 异构客户端会话访问;
· 非常简单地加密 API;
· 不跟任何的框架或者容器捆绑,可以独立运行。
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC(控制反转),DI( 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。它与Spring MVC能够很好地集成,并配备了流行的安全算法实现捆绑在一起。Spring Security在我们进行用户认证以及授予权限的时候,通过各种各样的拦截器来控制权限的访问,从而实现安全。
从功能上来讲,shiro能实现的,Spring Security 基本都能实现,依赖于Spring体系,但是好处是Spring全家桶的亲儿子,集成上更加契合,在使用上,比shiro略负责。但是Shiro比Spring Security更容易使用,也就是实现上简单一些,同时基本的授权认证Shiro也基本够用。
从社区活跃度来说,Spring Security社区支持度更高,Spring社区的亲儿子,支持力度和更新维护上有优势。相比之下Shiro的支持度就差了一点,但是依然还是有很多开发者在为Shiro做出贡献。
而Shiro 功能强大、简单、灵活。不跟任何的框架或者容器绑定,可以独立运行。因此对于非Spring的项目,Shiro兼容性更高一些。
因此,从比较上来讲,两者的区别不是很大。使用的时候,如果开发框架全部采用Spring全家桶的话,那么用Spring Security会比较合适一些。而对于刚开始接触安全管理框架或者是不用Spring全家桶的话,用Shiro比较好一些。
但是,同时我们也应该注意到,Shiro和Spring Security都已经诞生了十几年了,随着技术的演进发展,其基本框架也产生了一定局限性,尤其是对于前后端分离的框架来说,需要多做很多兼容性的工作。
在这种情况下,新的Java权限管理框架Sa-Token就应运而生了。
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权 等一系列权限相关问题。
Sa-Token 的 API 设计非常简单,以登录认证为例,只需要两行代码就可以完成了:
// 在登录时写入当前会话的账号id
StpUtil.login(10001);
// 然后在需要校验登录处调用以下方法:
// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常
StpUtil.checkLogin();
再比如权限认证,如下代码即可完成(只有具备 user:add 权限的会话才可以进入请求):
@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
return "用户增加";
看吧,是不是很简单,相比起Shrio和Spring Security繁琐来说,简单是懒人的福音。事实上,对于绝大部分的权限控制功能Sa-Token都能够用一句话来完成。就像下面一样。
StpUtil.login(10001); // 标记当前会话登录的账号id
StpUtil.getLoginId(); // 获取当前会话登录的账号id
StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false
StpUtil.logout(); // 当前会话注销登录
StpUtil.kickout(10001); // 将账号为10001的会话踢下线
StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false
StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false
StpUtil.getSession(); // 获取当前账号id的Session
StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session
StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值
StpUtil.login(10001, "PC"); // 指定设备标识登录,常用于“同端互斥登录”
StpUtil.kickout(10001, "PC"); // 指定账号指定设备标识踢下线 (不同端不受影响)
StpUtil.openSafe(120); // 在当前会话开启二级认证,有效期为120秒
StpUtil.checkSafe(); // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常
StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号
因此,技术发展日新月异,作为一名程序员,要紧跟时代的发展,才能使自己不至于落后。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.