我是 grails 的新手,我正在尝试实现 spring 安全核心和多租户单数据库插件。我先实现了spring security core,实现了自定义AuthenticationProvider和Authentication。然后我安装了多租户单数据库插件并运行自动创建自定义tenantResolver和tenantRepository的'mt-spring-security'脚本。我在tenantResolver 中硬编码了tenantId 用于测试目的。我在域类中添加了@MultiTenant 注释。
@多租户
类 ClientUser 实现 Serializable {
long idclient_user
Userprofile user
Client client
int tenantId
...
}
在 AuthenticationProvider 中,没有为当前租户过滤 ClientUser 数据。它将数据带给所有租户。
类 ClientAuthenticationProvider 实现 AuthenticationProvider {
Authentication authenticate(Authentication auth) throws AuthenticationException {
ClientAuthentication authentication = auth
String password = authentication.credentials
String username = authentication.name
String clientName = authentication.clientName
...
Userprofile.withTransaction { status ->
def user = Userprofile.findWhere(username: username)
def client = Client.findWhere(clientname: clientName)
def clientUser = ClientUser.findWhere(client: client, user: user) <-- NOT FILTERED FOR THE CURRENT TENANT. I HARD-CODED INVALID TENANTID IN THE TENANTRESOLVER AND EXPECTING IT TO FAIL BUT IT STILL FINDS THE USER.
if (!clientUser) {
throw new UsernameNotFoundException('User not found', username)
}
...
}
...
result
}
我不确定多租户和弹簧安全如何协同工作。我很难理解架构/设计。
如果有人可以为我提供示例实现或为我指明正确的方向,那将非常有帮助。谢谢,点菜