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

时间:2011-02-02 09:24:49

标签: security hibernate spring spring-security

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

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

    <sec:authorize ifAnyGranted="ROLE_USER">

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

    </sec:authorize>

  2. 用户现在正从数据库中恢复过来。 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 = ?" />

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

    我该怎么做?

    • 在会话中存储User对象需要做什么?这是正确的方法吗?
    • 我使用Hibernate。什么是过滤请求的最佳实践,例如对于名为“Task”的对象(在任务管理器中),根据登录用户? (我在MySQL数据库的tasks-table中有一个列和属性user_id)

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

1 个答案:

答案 0 :(得分:2)

如果您使用的是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所以讨论也可能是相关的。