Spring Security +自定义用户对象附加到会话以过滤请求

Posted

技术标签:

【中文标题】Spring Security +自定义用户对象附加到会话以过滤请求【英文标题】:Spring Security + custom User object attached to session for filtered requests 【发布时间】:2011-06-19 20:20:26 【问题描述】:

我不确定如何解决以下问题/实现我的方案。也许有人可以给我一些提示?

    我有一个带有 Spring Security 的 Spring MVC 应用程序。我还使用自定义登录页面。到目前为止一切正常,我可以使用以下代码在我的 JSP 上验证并显示登录用户。

    <sec:authorize ifAnyGranted="ROLE_USER">

    Logged in as <sec:authentication property="principal.username" />

    </sec:authorize>

    用户现在从数据库中检索。 XML 中的代码是

    <jdbc-user-service data-source-ref="dataSource" users-by-username-query="SELECT username, password , '1' AS enabled FROM users WHERE username = ?" authorities-by-username-query="SELECT username, 'ROLE_USER' FROM users WHERE username = ?" />

一切正常。问题是,我实际上有一个我想使用的自定义 User 类,并且可能保留在我的会话中,因为以后的 DB 请求应该根据登录的 User.id 过滤结果。

我该怎么做?

我需要怎么做才能将我的用户对象存储在我的会话中?这是正确的做法吗? 我使用休眠。过滤请求的最佳做法是什么,例如根据登录用户,对于称为“任务”的对象(在任务管理器中)? (我的 mysql 数据库的任务表中有一个列和属性 user_id)

非常感谢任何帮助或提示。只需要一些方向:-)

【问题讨论】:

【参考方案1】:

如果您使用的是 Spring Security 3.x,您可能需要检查Expression Based Access Control(例如@PostFilter)是否满足您的要求。

例如,如果你的 Task 对象有 username 成员,你可以这样做......

   @PostFilter("filterObject.username == authentication.name")
   public List<Task> getTasks() 
        ...
        tasks = TaskDao.findAll();
        return tasks;
    

这将返回属于登录用户的那些任务。

This SO 讨论也可能是相关的。

【讨论】:

我确实使用 Spring 3。我在我的 XML 中启用了表达式,但我看不出这如何帮助我将自定义用户附加到会话并过滤后续的 Hibernate 调用? @沙皇。根据您的评论更新了答案。 @Raghuram:感谢您的更新。我明白你的做法。但还有两个问题: 1. 这种方法不会产生很多开销吗?如我所见,TaskDAO.findAll() 将返回所有任务,但返回的列表将被过滤。正确的?这会从数据库中读取比需要更多的数据。 (另请参阅您的链接) 2.您知道什么是最好的:使用 SecurityContextHolder 中的“标准”用户名,使用它通过 DAO 获取域对象,然后在后续 DAO/服务调用中使用域对象的 ID 属性,或替换带有代表“我的”用户域对象的自定义 UserDetails? @沙皇。对于问题 1。你是对的。这是一个人为的例子。对于问题 2。我认为自定义 UserDetails 会更好。第一种方法涉及对每个服务调用进行两次调用。 @Raghuram:我很快检查了一下,@PostFilter 可以正常工作并正确过滤结果。所以“+1”,谢谢。但实际上我认为我更愿意使用过滤查询来最小化数据库流量。您能给我一些关于如何使用自定义用户、将其存储在会话中并将其用于我在服务/DAO 层中的调用的提示吗?

以上是关于Spring Security +自定义用户对象附加到会话以过滤请求的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Spring Security自定义用户认证

Spring Security-用户密码自定义加密

Spring Security自定义用户认证

如何防止 Spring Security 在会话中存储我的自定义 UserDetails 对象

Spring Security 自定义 UserDetailsS​​ervice 和自定义 User 类

Spring Security 实现自定义登录和认证:使用自定义的用户进行认证