我有一个Spring MVC应用程序,它使用经典的三层:控制器服务和dao。
应用程序中的相关模型包含User
Department
Project
。
一个用户属于一个部门,可能有很多项目属于某个部门,而且这些部门被组织成树状结构,例如:
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结果过滤器。
根据配置,在查询操作期间可能(或没有)考虑当前用户的部门,例如,当参数depId
是dep1-1-1
时,当前用户属于到dep1-1-2
,那么我们应该返回null。
如上所述,在某些情况下,此功能可能会完全关闭。
2身份验证。
用户身份验证和管理在另一个应用程序中提供,该应用程序将与我的应用程序部署在同一个域中,您可以认为它们是/tomcat/webapps
内的两个不同文件夹。我们使用cookie来共享用户信息:为用户保存令牌。
对于每个请求,这意味着我必须从cookie获取当前用户的令牌(如果他们有登录),然后调用其他应用程序提供的服务以获取department
之类的信息等等。
那么在控制器或服务部门进行部门检查?我不确定是否将HttpRequest
注入服务是一个好主意。
此外,由于与此类操作相关的控制器和服务太多,我想避免在任何地方重复使用这些代码。
有没有更好的选择?
答案 0 :(得分:0)
这可能有点矫枉过正,但你所要求的让我想到弹簧安全:
PreauthenticatedAuthenticationFilter
,它将使用cookie来获取用户信息并填充Spring Security Authentication
令牌。这部分很容易配置。结果过滤器:摘自spring安全参考手册:
Spring Security支持过滤集合和数组,现在可以使用表达式实现。这通常是在方法的返回值上执行的。例如:
@PreAuthorize("hasRole('ROLE_USER')")
@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, 'admin')")
public List<Contact> getAll();
使用@PostFilter注释时,Spring Security会遍历返回的集合并删除所提供的表达式为false的所有元素
所有这些都是通过Spring AOP实现的,因此很容易在服务方法上添加这些注释。
Spring Security在Spring MVC应用程序中很好地集成。唯一的问题是包括域对象安全性在内的完整配置并不是真正的微不足道......