清洁架构和身份验证。正确的方式?
Posted
技术标签:
【中文标题】清洁架构和身份验证。正确的方式?【英文标题】:Clean Architecture and authentication. Correct way? 【发布时间】:2019-07-08 18:34:26 【问题描述】:我正在开发基于 Clean Architecture 模式的 android 应用程序,但我怀疑如何以干净的方式实现用户身份验证。就干净架构而言,以下解决方案是否干净?
我会创建如下用例(从表示层执行):
LoginUseCase
(用于提供的登录名和密码通过远程服务获取api令牌并保存在本地令牌源中)
LogoutUseCase
(从LocalTokenSource
清除令牌)
(LocalTokenSource
接口将存储在领域层,其实现在数据层 - 一种存储库)
为了在每次应用启动时执行令牌刷新(从用户的角度来看,这不是一个用例,对吧?)我会在域层创建 SessionManager
组件。 SessionManager
将负责刷新令牌并将其保存在 LocalTokenSource
中。每次活动开始时,我都会从它的演示者那里执行refreshToken()
注入SessionManager.
你如何看待解决方案?
如果它是干净的,那么如何处理将令牌传递给远程服务以执行其他需要令牌的 API 方法?假设我有 PostsRepository
从远程服务获取帖子数据。我应该将令牌从用例传递到像repo.getPosts(token)
这样的存储库方法吗?或者将LocalTokenSource
注入到存储库中,这样它就可以自己读取令牌?第二个选项会不会违反 Clean Architecture 规则,因为 LocalTokenSource
将用于 2 层?
【问题讨论】:
【参考方案1】:您必须决定的核心问题是:您要将授权(以及令牌的使用)建模为业务逻辑的一个方面,还是要将其视为“实施细节”。
如果您首先决定,有专门的用例,将 SessionManager 添加到域层并将令牌传递到存储库将是一个一致的建模。
如果您决定稍后,登录/注销/刷新以及令牌的存在可能最好保留在“幕后”,因此在框架或网关层中。
这两种方法都将遵循 Clean Architecture 的规则(只要您不违反依赖关系规则)。
【讨论】:
感谢您的意见,现在我可以更有信心地工作了 ;-)以上是关于清洁架构和身份验证。正确的方式?的主要内容,如果未能解决你的问题,请参考以下文章