清洁架构和身份验证。正确的方法?
Clean Architecture and authentication. Correct way?
我正在开发一个基于 Clean Architecture 模式的 Android 应用程序,我对如何以干净的方式实现用户身份验证存疑。就清洁架构而言,以下解决方案是否清洁?
我会创建如下用例(从表示层执行):
LoginUseCase
(对于提供的登录名和密码,通过远程服务获取 api 令牌并保存在本地令牌源中)
LogoutUseCase
(从 LocalTokenSource
清除令牌)
(LocalTokenSource
接口将存储在域层中,其实现在数据层中 - 一种存储库)
并且为了在每次应用启动时执行令牌刷新(从用户的角度来看这不是一个用例,对吧?)我会在领域层创建 SessionManager
组件。 SessionManager
将负责刷新令牌并将其保存在 LocalTokenSource
中。每次 activity 启动时,我都会从它的演示者那里执行 refreshToken()
注入 SessionManager.
你觉得这个解决方案怎么样?
如果它是干净的,那么如何处理将令牌传递给远程服务以执行其他需要令牌的 API 方法?假设我有 PostsRepository
从远程服务获取帖子数据。我应该将令牌从用例传递到存储库方法,如 repo.getPosts(token)
吗?或者将 LocalTokenSource
注入存储库,以便它可以自己读取令牌?第二个选项不会违反 Clean Architecture 规则,因为 LocalTokenSource
会在 2 层中使用吗?
您必须决定的核心问题是:您是要将授权(以及令牌的使用)建模为业务逻辑的一个方面,还是要将其视为 "implementation detail".
如果您首先决定,有专门的用例,将 SessionManager 添加到域层并将令牌传递到存储库将是一致的建模。
如果以后决定,login/logout/refresh以及token的存在最好保存"behind the scenes",所以在framework或者gateway层
这两种方法都遵循 Clean Architecture 的规则(只要您不违反依赖规则)。
我正在开发一个基于 Clean Architecture 模式的 Android 应用程序,我对如何以干净的方式实现用户身份验证存疑。就清洁架构而言,以下解决方案是否清洁?
我会创建如下用例(从表示层执行):
LoginUseCase
(对于提供的登录名和密码,通过远程服务获取 api 令牌并保存在本地令牌源中)LogoutUseCase
(从LocalTokenSource
清除令牌)
(LocalTokenSource
接口将存储在域层中,其实现在数据层中 - 一种存储库)
并且为了在每次应用启动时执行令牌刷新(从用户的角度来看这不是一个用例,对吧?)我会在领域层创建 SessionManager
组件。 SessionManager
将负责刷新令牌并将其保存在 LocalTokenSource
中。每次 activity 启动时,我都会从它的演示者那里执行 refreshToken()
注入 SessionManager.
你觉得这个解决方案怎么样?
如果它是干净的,那么如何处理将令牌传递给远程服务以执行其他需要令牌的 API 方法?假设我有 PostsRepository
从远程服务获取帖子数据。我应该将令牌从用例传递到存储库方法,如 repo.getPosts(token)
吗?或者将 LocalTokenSource
注入存储库,以便它可以自己读取令牌?第二个选项不会违反 Clean Architecture 规则,因为 LocalTokenSource
会在 2 层中使用吗?
您必须决定的核心问题是:您是要将授权(以及令牌的使用)建模为业务逻辑的一个方面,还是要将其视为 "implementation detail".
如果您首先决定,有专门的用例,将 SessionManager 添加到域层并将令牌传递到存储库将是一致的建模。
如果以后决定,login/logout/refresh以及token的存在最好保存"behind the scenes",所以在framework或者gateway层
这两种方法都遵循 Clean Architecture 的规则(只要您不违反依赖规则)。