我需要为我的Spring Security' UserDetailsService
的实现提供一个可选的附加参数。
作为一个简单的例子,让我们说我需要为属于用户的宠物传递宠物ID。
并非所有用户都有宠物,但如果他们这样做,我的Person
实施UserDetails
的类会有一个需要在登录后检索的宠物。
这是我到目前为止所尝试的内容:
How to pass an additional parameter with spring security login page
接受回答的问题是UserDetailsService
实施情结感到错误/漏洞,以及HttpRequest
和HttpSession
的认知。
我看过的其他方法涉及自定义AuthenticationDetails
和AuthenticationDetailsSource
,但这也感觉不对,因为UserDetailsService
似乎应该对单个事物负责(加载用户详细信息),并且Pet将成为这些用户详细信息的一部分。
我知道我可以采用其中一种方法来工作,但他们感觉不干净。有没有人想出一个解决这个问题的好方法?不寻找任何人为我编写代码,只是寻找一般的方法。
非常感谢!
答案 0 :(得分:1)
我认为对UserDetails的目的可能存在误解。查看Javadoc UserDetails是关于用户如何与应用程序/系统的安全设备相关联的。如方法摘要所示; getPassword,getUsername,getAuthorities等,本质上是谁(authC)以及他们可以做什么(authZ)。加载用户的宠物信息更多的是业务问题,应该在一个单独的服务PetService.doesUserHavePet(User)PerService.loadPet(User)中处理,而不是在你应该加载的UseDetailsService的实现中。组织目录服务和/或用户存储中的用户信息。我认为你之所以找到每种方法都不那么干净的原因是你试图将两个概念/责任合并到一个类中。