YC-Framework鉴权主要基于Dromara开源社区组织下的Sa-Token。
Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权等一系列权限相关问题。
我在从单体架构到分布式微服务架构的思考这篇文章中所强调技术选型的八点如业务相关性、框架流行度、学习曲线、文档丰富程度、社区支持、单元测试、可扩展性、许可证等。Sa-Token均满足。
Sa-Token官方文档:
https://sa-token.dev33.cn/doc/#/
Sa-Token Github源代码:
https://github.com/dromara/sa-token
Sa-Token Gitee源代码:
https://gitee.com/dromara/sa-token
基本上结合自己的业务需求,整体过一遍Sa-Token官方文档,就能学会如何使用Sa-Token。
开源不易,如果Sa-Token对你帮助,不妨点个star鼓励一下对应的开源小伙伴们!!!
主要步骤如下:
启动完毕以后,通过浏览器访问本地地址:
http://localhost:8080/doc.html
可以看到如下效果:
接下来点击认证管理会出现如下列表,找到登录接口,输入对应的信息,如下所示,就表示登录成功:
YC-Framework中的鉴权模块叫yc-common-security,属于yc-common模块下的子模块。如图所示:
其中核心类叫SaTokenConfigure.java,代码如下:
@Configuration@Slf4jpublic class SaTokenConfigure implements WebMvcConfigurer, StpInterface { @Autowired private UserApi userApi; /** * 注册拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 注册路由拦截器,自定义验证规则 registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> { //登录认证 SaRouter.match("/**", () -> StpUtil.checkLogin()); // 角色认证 -- 拦截以 admin 开头的路由,必须具备 admin 角色或者 super-admin 角色才可以通过认证 SaRouter.match("/company/**", () -> StpUtil.checkRoleOr("admin", "super-admin")); //权限认证 SaRouter.match("/company/**", () -> StpUtil.checkPermission("company")); SaRouter.match("/user/**", () -> StpUtil.checkPermission("admin")); SaRouter.match("/role/**", () -> StpUtil.checkPermission("admin")); })).addPathPatterns("/**").excludePathPatterns( "/auth/**", "/doc.html", "/webjars/**", "/swagger-resources", "/actuator/**"); } @Override public List<String> getPermissionList(Object loginId, String loginType) { log.info("loginId:" + loginId + "||" + loginType); List<String> permList = new ArrayList<>(); UserIdReqDTO permReq = new UserIdReqDTO(); permReq.setUserId(handleUserId(loginId.toString())); RespBody<List<String>> resultBody = userApi.getPerm(permReq); if (RespCode.SELECT_SUCCESS.getCode().equals(resultBody.getCode())) { permList = resultBody.getData(); } return permList; } @Override public List<String> getRoleList(Object loginId, String loginType) { log.info("loginId:" + loginId + "||" + loginType); List<String> roleList = new ArrayList<>(); UserIdReqDTO permReq = new UserIdReqDTO(); permReq.setUserId(handleUserId(loginId.toString())); RespBody<List<String>> resultBody = userApi.getRole(permReq); if (RespCode.SELECT_SUCCESS.getCode().equals(resultBody.getCode())) { roleList = resultBody.getData(); } return roleList; } /** * 处理用户ID * * @param userId * @return */ private String handleUserId(String userId) { return userId.substring(userId.lastIndexOf(ApplicationConst.DEFAULT_FLAG) + 1).replace(ApplicationConst.DEFAULT_FLAG, ApplicationConst.NULL_STR); }}
该代码存放目录为:
https://github.com/developers-youcong/yc-framework/tree/main/yc-common/yc-common-security
不难看出基于拦截器相关。之前写过一篇叫Java Web之三大利器的文章,所谓Java Web 三大利器指的是拦截器、过滤器、监听器等。其中拦截器与过滤器在权限认证相关用的比较多。
之前还写过关于重构某网API服务的文章可供读者朋友参考,这篇文章是基于公司系统权限重构的背景,在此我提供了两种方法,一种是基于原生的拦截器,另外一方面是基于Sa-Token。
一方面符合YC-Framework的架构思想之一模块化;另外一方面在于按需引入,哪一个微服务需要,只需引入对应的依赖即可。如下所示:
<dependency> <groupId>com.yc.framework</groupId> <artifactId>yc-common-security</artifactId></dependency>