在Spring MVC中处理cookie



我有一个Spring MVC应用程序,它使用经典的三层:控制器服务和dao。

并且应用程序中的相关模型包含UserDepartmentProject.

一个用户将属于一个部门,并且可能有很多项目属于某个部门,并且这些部门被组织成树状结构,例如:

dep1
dep1-1
dep1-1-1
dep1-1-2
...
...
...

现在我有一个控制器来列出项目:

class ProjectController{
private ProjectService projectService;
@RequestMapping("/list")
public String list(@RequestParameter("depId") String depId){
projectService.list(depId);
return "list";
}
}
ProjectServiceImpl implements ProjectService{
ProjectDao projectDao;
public List<Department> list(String depId){
}
}

这似乎很简单,但是我们有两个问题:

1 结果筛选器。

根据配置,在查询操作时可能(或不)考虑当前用户的部门,例如,当参数depIddep1-1-1,并且当前用户属于dep1-1-2时,那么我们应该返回null。

如前所述,此功能在某些情况下可能会完全关闭。

2 身份验证。

用户身份验证和管理在另一个应用程序中提供,该应用程序将与我的应用程序部署在同一域中,您可以认为它们是/tomcat/webapps中的两个不同文件夹。我们使用cookie来共享用户信息:为用户保存令牌。

这意味着对于每个请求,我都必须从cookie中获取当前用户的令牌(如果他们有登录名),然后调用其他应用程序提供的服务来获取department等信息。

那么在哪里进行部门检查,在控制器或服务中?我不确定将HttpRequest注入服务是否是一个好主意。

另外,由于与此类操作相关的控制器和服务太多,因此我想避免到处出现重复代码。

还有更好的选择吗?

这可能有点矫枉过正,但你的要求让我想到弹簧安全:

  • 身份验证 :Spring Security 可以直接执行此操作,但您也可以实现一个自定义PreauthenticatedAuthenticationFilter,该将使用 cookie 获取用户信息并填充 Spring SecurityAuthentication令牌。这部分简单且高度可配置。
  • 结果过滤器:摘自 Spring 安全参考手册:

    Spring 安全性支持对集合和数组进行过滤,现在可以使用表达式来实现这一点。这最常对方法的返回值执行。例如:

    @PreAuthorize("hasRole('ROLE_USER')")
    @PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, 'admin')")
    public List<Contact> getAll();
    

    使用 @PostFilter 注释时,Spring 安全性会遍历返回的集合,并删除所提供表达式为 false 的任何元素

    所有这些都是通过Spring AOP实现的,因此很容易在服务方法上添加这些注释。

SpringSecurity 很好地集成到 Spring MVC 应用程序中。唯一的问题是,包括域对象安全性在内的完整配置并不是一件容易的事......

最新更新