用户访问的单点认证鉴权方法、系统和介质转让专利

申请号 : CN202310316604.6

文献号 : CN116028915B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙展飞赵何张志琦

申请人 : 江苏智云天工科技有限公司

摘要 :

本发明涉及WEB应用技术领域,尤其涉及一种用户访问的单点认证鉴权方法,包括:登录页面被用户发起请求时,用户访问前先在前端服务进行登录,获取用户的access_token;在向后端服务访问时,在请求头带上用户的access_token,后端服务通过对带上请求头的用户的access_token进行校验,实现单点认证;单点认证完成后,用户的登录信息被保存在安全上下文中,并向统一用户平台发送用户权限查询请求,对当前用户进行访问鉴权控制。本发明提供一种用户访问的单点认证鉴权方法,通过将前后端分离,能够实现自定义用户访问的认证和鉴权。

权利要求 :

1.一种用户访问的单点认证鉴权方法,其特征在于,所述方法包括:S1:登录页面被用户发起请求时,用户访问前先在前端服务进行登录,获取用户的access_token;

S2:在向后端服务访问时,在请求头上带上所述用户的access_token,后端服务通过对带上请求头的所述用户的access_token进行校验,实现单点认证;

S3:单点认证完成后,用户信息被保存在安全上下文中,并向统一用户平台发送用户权限查询请求,对当前用户进行访问鉴权控制;

其中,所述S1包括:

S11:在所述前端服务中引入Keycloak.js适配器,配置文件中写入 Keycloak的请求参数,入口文件main.js集成所述Keycloak的请求参数并初始化一个全局对象kc;

S12:在所述S11中获取一所述全局对象kc,根据所述全局对象kc的authenticated状态判断用户是否已登录;

若所述authenticated状态为true,用户已登录,则会将所述用户的access_token写入session中,获取所述用户的access_token;

若所述authenticated状态为false,用户未登录,则重定向至登录页面,等待用户重新请求登录,直至用户登录成功,刷新所述authenticated状态直至所述authenticated状态为true,再将所述用户的access_token写入所述session中,获取所述用户的access_token;

所述S2具体包括:

S21:用户在所述前端服务的登录页面登录完成,所有访问在所述后端服务的请求都会附带Authorization请求头;

S22:所述后端服务获取Authorization请求头的访问信息;

S23:所述后端服务内集成了Keycloak适配器,在所述Keycloak适配器中注册filter过滤器;

S24:所述filter过滤器解析附带Authorization请求头中的Authorization字段,获取用户的access_token;

S25:通过所述Keycloak适配器内设置的AdapterTokenVerifier校验器对所述用户的access_token进行校验;

若校验通过,则请求被放行,完成单点登录认证,执行所述S3;

反之,若校验不通过,则直接返回未认证的响应,拒绝访问;

所述访问鉴权控制通过Spring框架提供的HandlerInterceptor接口实现,所述S3具体包括:S31:根据所述安全上下文中的所述用户的登录信息,获取userId,结合所述userId的参数、以及当前业务系统的systemId参数,向统一用户平台发起查询用户权限的请求,所述请求中携带Authorization请求头,获取的权限信息;

S32:在所述Spring框架中自定义AuthzInterceptor鉴权访问拦截器,实现HandlerInterceptor接口,覆写HandlerInterceptor接口方法;

若请求类型是方法类型,则进入拦截器判断;

若请求类型不是方法类型,则放行请求;

S33:进入拦截器判断后,查询所述S31中的权限信息,判断当前用户是否拥有所述Spring框架中的controller接口的访问权限;

若有,则放行请求,执行下一步;

若没有,则返回“访问被拒绝”响应,结束请求;

步骤34:拦截所述controller接口中的所有Controller方法,校验请求的Controller方法是否被@Resource注解修饰过;

若请求的Controller方法有被@Resource注解修饰过,则继续执行下一步;

若请求的Controller方法没有被@Resource注解修饰过,则直接放行请求,通过授权;

S35:解析@Resource注解属性的value值,与所述S31获取的权限信息进行匹配;

若不匹配,则访问被拒绝;

若匹配,则放行请求,通过授权。

2.如权利要求1所述的用户访问的单点认证鉴权方法,其特征在于,所述统一用户平台采用RBAC模型,进行角色访问控制,在执行所述S31前,所有的所述用户权限、所述角色和所述用户预先在所述统一用户平台正确配置。

3.如权利要求1所述的用户访问的单点认证鉴权方法,其特征在于,所述用户信息还通过SPI接口的方式动态加载到Keycloak服务中。

4.如权利要求3所述的用户访问的单点认证鉴权方法,其特征在于,使用mvn package命令构建所述Keycloak服务和所述统一用户平台单点认证鉴权的依赖包。

5.一种采用如权利要求1至4中任一项所述的用户访问的单点认证鉴权方法的鉴权系统,其特征在于,所述鉴权系统包括:登录单元(100),登录页面被用户发起请求时,用户访问前先在前端服务进行登录,获取用户的access_token;

认证单元(200),与登录单元连接,在向后端服务访问时,在请求头上带上所述用户的access_token,后端服务通过对带上请求头的所述用户的access_token进行校验,实现单点认证;

鉴权单元(300),与认证单元连接,单点认证完成后,用户的登录信息被保存在安全上下文中,并向统一用户平台发送用户权限查询请求,对当前用户进行访问鉴权控制。

6.一种介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1至4中任一项所述的用户访问的单点认证鉴权方法。

说明书 :

用户访问的单点认证鉴权方法、系统和介质

技术领域

[0001] 本发明涉及WEB应用技术领域,尤其涉及一种用户访问的单点认证鉴权方法、系统和介质。

背景技术

[0002] 随着业务的不断发展,创建的系统越来越多,若每个系统都有独立的用户认证鉴权机制,不仅增加了系统开发维护的工作量和开发成本高,而且多个系统之间的无法实现相互访问,给用户造成很差的使用体验,不利于不同业务系统之间协同工作。因此,基于Keycloak技术平台已经提供的OIDC实现,可以很好地实现单点登录的需求,尽管Keycloak技术平台同时也提供了鉴权服务,如果全部采用Keycloak技术平台提供的服务,则会高耦合,无法实现自定义的鉴权,另外,Keycloak技术平台的结构隐晦、数量繁杂,导致未来数据迁移成为难题。

发明内容

[0003] 本发明要解决的技术问题是:为了解决现有技术中全部采用Keycloak技术平台提供的服务会高度耦合,无法实现自定义的鉴权的技术问题,本发明提供一种用户访问的单点认证鉴权方法,通过将前后端分离,能够实现自定义用户访问的认证和鉴权。
[0004] 本发明解决其技术问题所采用的技术方案是:一种用户访问的单点认证鉴权方法,所述方法包括:
[0005] S1:登录页面被用户发起请求时,用户访问前先在前端服务进行登录,获取用户的access_token;
[0006] S2:在向后端服务访问时,在请求头上带上所述用户的access_token,后端服务通过对带上请求头的所述用户的access_token进行校验,实现单点认证;
[0007] S3:单点认证完成后,用户信息被保存在安全上下文中,并向统一用户平台发送用户权限查询请求,对当前用户进行访问鉴权控制。
[0008] 进一步,具体地,所述S1包括:
[0009] S11:在所述前端服务中引入Keycloak.js适配器,配置文件中写入 Keycloak的请求参数,入口文件main.js集成所述Keycloak的请求参数并初始化一个全局对象kc;
[0010] S12:在所述S11中获取一所述全局对象kc,根据所述全局对象kc的authenticated状态判断用户是否已登录;
[0011] 若所述authenticated状态为true,用户已登录,则会将所述用户的access_token写入session中,获取所述用户的access_token;
[0012] 若所述authenticated状态为false,用户未登录,则重定向至登录页面,等待用户重新请求登录,直至用户登录成功,刷新所述authenticated状态直至所述authenticated状态为true,再将所述用户的access_token写入所述session中,获取所述用户的access_token。
[0013] 进一步,具体地,所述S2具体包括:
[0014] S21:用户在所述前端服务的登录页面登录完成,所有访问在所述后端服务的请求都会附带Authorization请求头;
[0015] S22:所述后端服务获取Authorization请求头的访问信息;
[0016] S23:所述后端服务内集成了Keycloak适配器,在所述Keycloak适配器中注册filter过滤器;
[0017] S24:所述filter过滤器解析附带Authorization请求头中的Authorization字段,获取用户的access_token;
[0018] S25:通过所述Keycloak适配器内设置的AdapterTokenVerifier校验器对所述用户的access_token进行校验;
[0019] 若校验通过,则请求被放行,完成单点登录认证,执行所述S3;
[0020] 反之,若校验不通过,则直接返回未认证的响应,拒绝访问。
[0021] 进一步,具体地,所述访问鉴权控制通过Spring框架提供的HandlerInterceptor接口实现,具体如下:
[0022] S31:根据所述安全上下文中的所述用户的登录信息,获取userId,结合所述userId的参数、以及当前业务系统的systemId参数,向统一用户平台发起查询用户权限的请求,所述请求中携带Authorization请求头,获取的权限信息;
[0023] S32:在所述Spring框架中自定义AuthzInterceptor鉴权访问拦截器,实现HandlerInterceptor接口,覆写HandlerInterceptor接口方法;
[0024] 若请求类型是方法类型,则进入拦截器判断;
[0025] 若请求类型不是方法类型,则放行请求;
[0026] S33:进入拦截器判断后,查询所述S31中的权限信息,判断当前用户是否拥有所述Spring框架中的controller接口的访问权限;
[0027] 若有,则放行请求,执行下一步;
[0028] 若没有,则返回“访问被拒绝”响应,结束请求;
[0029] 步骤34:拦截所述controller接口中的所有Controller方法,校验请求的Controller方法是否被@Resource注解修饰过;
[0030] 若请求的Controller方法有被@Resource注解修饰过,则继续执行下一步;
[0031] 若请求的Controller方法没有被@Resource注解修饰过,则直接放行请求,通过授权;
[0032] S35:解析@Resource注解属性的value值,与所述S31获取的权限信息进行匹配;
[0033] 若不匹配,则访问被拒绝;
[0034] 若匹配,则放行请求,通过授权。
[0035] 进一步,具体地,所述统一用户平台采用RBAC模型,进行角色访问控制,在执行所述S31前,所有的所述用户权限、所述角色和所述用户预先在所述统一用户平台正确配置。
[0036] 进一步,具体地,所述用户信息还通过SPI接口的方式动态加载到Keycloak服务中。
[0037] 进一步,具体地,使用mvn package命令构建所述Keycloak服务和所述统一用户平台单点认证鉴权的依赖包。
[0038] 一种采用如上所述的用户访问的单点认证鉴权方法的鉴权系统,所述鉴权系统包括:
[0039] 登录单元,登录页面被用户发起请求时,用户访问前先在前端服务进行登录,获取用户的access_token;
[0040] 认证单元,与登录单元连接,在向后端服务访问时,在请求头上带上所述用户的access_token,后端服务通过对带上请求头的所述用户的access_token进行校验,实现单点认证;
[0041] 鉴权单元,与认证单元连接,单点认证完成后,用户的登录信息被保存在安全上下文中,并向统一用户平台发送用户权限查询请求,对当前用户进行访问鉴权控制。
[0042] 一种介质,其上存储有计算机程序,该程序被处理器执行时实现如上所述的用户访问的单点认证鉴权方法。
[0043] 本发明的有益效果是,本发明的用户访问的单点认证鉴权方法,通过前端Keycloak服务用于单点登录认证,后端服务的统一用户平台用于鉴权访问,实现了前后端分离,将Keycloak服务和统一用户平台配合使用,在不同业务系统单点认证鉴权能够统一实现,便于协同工作,实现了用户、角色和权限的统一集中管理,相对于现有技术,不需要每个系统单独建立一个账号,而且打破了各个业务系统的访问壁垒,实现了一个账号可以处处访问的效果。

附图说明

[0044] 下面结合附图和实施例对本发明进一步说明。
[0045] 图1是本发明实施例一的流程示意图。
[0046] 图2是本发明实施例二的结构示意图。
[0047] 图中100、登录单元;200、认证单元;300、鉴权单元。

具体实施方式

[0048] 现在结合附图对本发明作进一步详细的说明。这些附图均为简化的示意图,仅以示意方式说明本发明的基本结构,因此其仅显示与本发明有关的构成。
[0049] 实施例1
[0050] 如图1所示,本发明实施例一,一种用户访问的单点认证鉴权方法,包括:
[0051] S1:登录页面被用户发起请求时,用户访问前先在前端服务进行登录,获取用户的access_token,其中,access_token为访问令牌,该访问令牌包含了当前用户登陆会话的安全信息,登录一次,服务器生成一个token,只需每次请求附带这个token就能对网站标识自己的身份。
[0052] S2:在向后端服务访问时,在请求头上带上用户的access_token,后端服务通过对带上请求头的用户的access_token进行校验,实现单点认证;
[0053] S3:单点认证完成后,用户信息被保存在安全上下文中,并向统一用户平台发送用户权限查询请求,对当前用户进行访问鉴权控制。
[0054] 在实施例中,S1包括:
[0055] S11:在前端服务中引入Keycloak.js适配器,配置文件中写入 Keycloak的请求参数,入口文件main.js集成Keycloak的请求参数并初始化一个全局对象kc其中,kc为自定义的全局对象变量,全局对象kc用于登录、获取用户信息、token写入session中、对过期token更新机制以及登出等功能;
[0056] S12:在S11中获取一全局对象kc,根据全局对象kc的authenticated状态判断用户是否已登录;
[0057] 若authenticated状态为true(true为1),用户已登录,则会将用户的access_token写入session中,获取用户的access_token;
[0058] 若authenticated状态为false(false为0),用户未登录,则重定向至登录页面,等待用户重新请求登录,直至用户登录成功,刷新authenticated状态直至authenticated状态为true,将用户的access_token写入session中,获取用户的access_token。
[0059] 需要说明的是,前端服务为Keycloak服务,Keycloak是一个针对Web应用和RESTful Web API提供SSO(Single Sign On:单点登陆),是一个开源软件,是一个针对现代应用程序和服务的开源身份和访问管理解决方案。可以轻松保护应用程序和服务,几乎不需要写代码。用户使用Keycloak而不是单个应用程序进行身份验证。通过Keycloak服务的应用程序不必处理登录表单,验证用户身份和存储用户。
[0060] 在实施例中,S2具体包括:
[0061] S21:用户在Keycloak服务的登录页面登录完成,获取所有访问在后端服务的请求都会附带Authorization请求头,即在用户的access_token上带上Authorization请求头,附带Authorization请求头便于提供给后端进行身份认证和鉴权。
[0062] S22:后端服务获取Authorization请求头的访问信息;
[0063] S23:后端服务内集成了Keycloak适配器,在Keycloak适配器中注册filter过滤器;
[0064] S24:filter过滤器解析Authorization请求头中的Authorization字段,获取用户的access_token;
[0065] S25:通过Keycloak适配器内设置的AdapterTokenVerifier校验器对用户的access_token进行校验;
[0066] 若校验通过,则请求被放行,完成单点登录认证,执行S3;
[0067] 反之,若校验不通过,则直接返回未认证的响应,拒绝访问。
[0068] 在S25中,利用用户的access_token和KeycloakDeployment创建AdapterTokenVerifier校验器,调用AdapterTokenVerifier校验器中的verify方法对用户的access_token进行校验。
[0069] 在实施例中,访问鉴权控制通过Spring框架提供的HandlerInterceptor接口实现,具体如下:
[0070] S31:根据保存在安全上下文中的用户的登录信息,获取userId(用户Id),结合 userId的参数、以及当前业务系统的systemId(当前服务Id)参数,向统一用户平台发起查询用户权限的请求,请求中携带Authorization请求头,获取的权限信息,权限信息会采用redis缓存的方式暂存到业务系统本地,减轻统一用户平台的QPS(Queries Per Second:每秒查询率)压力,提升系统的整体响应速度,通过redis缓存中间件高效读写性能,提供舒适的客户体验。
[0071] S32:在Spring框架中自定义AuthzInterceptor鉴权访问拦截器,实现HandlerInterceptor接口,覆写HandlerInterceptor接口方法;
[0072] 若请求类型是方法类型,则进入拦截器判断,执行S33;
[0073] 若请求类型不是方法类型,则放行请求;
[0074] S33:查询S31中的权限信息,判断当前用户是否拥有Spring框架中的controller接口的访问权限;
[0075] 若有,则放行请求,执行S34;
[0076] 若没有,则返回“访问被拒绝”响应,结束请求;
[0077] 步骤34:拦截所有Controller方法,校验请求的Controller方法是否被@Resource注解修饰过;
[0078] 若请求的Controller方法有被@Resource注解修饰过,则执行S35;
[0079] 若请求的Controller方法没有被@Resource注解修饰过,则直接放行请求,通过授权;
[0080] S35:解析@Resource注解属性的value值,与S31获取的权限信息进行匹配;
[0081] 若不匹配,则访问被拒绝;
[0082] 若匹配,则放行请求,通过授权;
[0083] 在实施例中,统一用户平台采用RBAC(Role‑Based Access Control,基于角色的访问控制)模型,进行角色访问控制,在执行S31前,所有的用户权限、角色和用户预先在统一用户平台正确配置,换而言之,统一用户平台用于维护用户权限、角色和用户的信息。当用户权限、角色和用户需要进行修改时,超级管理员或系统管理员登录到统一用户平台进行操作,具体的,将@Resource注解属性value值配置到用户权限的属性中,超级管理员或系统管理员可以进行自定义访问控制。
[0084] 用户访问前端页面时,页面首先调用统一用户平台后端接口获取用户所在当前应用的授权权限,并保存在全局变量中;前端页面根据获取的权限信息,渲染页面应该展示的菜单、接口;其中授权权限通过本发明的用户访问的单点认证鉴权方法实现,通过认证鉴权使一个账号可以处处访问不同的业务系统。
[0085] 在实施例中,用户信息还通过SPI接口的方式动态加载到Keycloak服务中。具体的,使用用户存储 SPI 将扩展写入Keycloak服务以连接到外部用户数据库。由于现有的专用用户数据库无法完全迁移到 Keycloak数据模型,所以必须编写用户存储 SPI 的实现来桥接外部用户数据库和 Keycloak服务,用来登录用户和管理用户的内部用户对象模型。用户存储 SPI 可以实现复杂的条件查询、对用户执行 CRUD 操作、认证和管理凭据、或者一次执行多个用户的批量更新,且便于数据的迁移。
[0086] 实现数据迁移包括以下步骤:
[0087] A:实现Keycloak开放的UserStorageProvider、UserStorageProviderFactory和ImportSynchronization 接口,提供自定义的方法实现。
[0088] B :将META‑INF/services/org.Keycloak.storage.UserStorageProviderFactory文件添加到项目中,此文件写入了UserStorageProviderFactory的全路径类名。
[0089] C: 将上述自定义SPI项目打成jar包,并放置在Keycloak服务的standalone/deployments/目录下,Keycloak服务就可以识别到自定义的SPI jar包,并加载其中的功能,完成数据迁移。
[0090] 在实施例中,使用mvn package命令构建Keycloak服务和统一用户平台单点认证鉴权的依赖包。
[0091] 本发明的用户访问的单点认证鉴权方法,通过Keycloak服务用于单点登录认证,统一用户平台用于鉴权访问。将Keycloak服务和统一用户平台配合使用,在不同业务系统单点认证鉴权能够统一实现,便于协同工作,实现了用户、角色和权限的统一集中管理,相对于现有技术,不需要每个系统单独建立一个账号,而且打破了各个业务系统的访问壁垒,实现了一个账号可以处处访问的效果。
[0092] 实施例2
[0093] 基于与前述实施例一中一种用户访问的单点认证鉴权方法同样发明构思,本发明还提供了一种用户访问的单点认证鉴权系统,如图2所示,鉴权系统包括:
[0094] 登录单元100,登录页面被用户发起请求时,用户访问前先在前端服务进行登录,获取用户的access_token;认证单元200,与登录单元连接,在向后端服务访问时,在请求头上带上用户的access_token,后端服务通过对带上请求头的用户的access_token进行校验,实现单点认证;鉴权单元300,与认证单元连接,单点认证完成后,用户的登录信息被保存在安全上下文中,并向统一用户平台发送用户权限查询请求,对当前用户进行访问鉴权控制。
[0095] 前述图1实施例一中的一种用户访问的单点认证鉴权方法的各种变化方式和具体实例同样适用于本实施例的一种用户访问的单点认证鉴权系统,通过前述对一种用户访问的单点认证鉴权方法的详细描述,本领域技术人员可以清楚的知道本实施例中一种用户访问的单点认证鉴权系统的实施方法,所以为了说明书的简洁,此处不再详述。
[0096] 实施例3
[0097] 本发明的计算机存储介质上存储有计算机程序,该计算机程序被处理器执行时实现用户访问的单点认证鉴权方法。
[0098] 本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过计算机程序相关的硬件来完成。前述的计算机程序可以存储于一计算机可读存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的计算机可读存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的计算机存储介质。
[0099] 以上述依据本发明的理想实施例为启示,通过上述的说明内容,相关工作人员完全可以在不偏离本项发明技术思想的范围内,进行多样的变更以及修改。本项发明的技术性范围并不局限于说明书上的内容,必须要根据权利要求范围来确定其技术性范围。