java - Spring MVC 和安全性 - 授权期间 protected 资源的识别

标签 java spring-mvc design-patterns model-view-controller spring-security

我正在使用 Spring MVC 和 Spring Security 构建 Tomcat/Java MVC Servlet 应用程序,并且发现 Controller 的功能和授权步骤之间存在架构不一致的情况。

在标准 MVC 中,显示 Controller 检查请求,构建所涉及的业务资源的模型表示,并指定将输出呈现给客户端的 View 。

在我的用例中,提供的“业务资源”是一个“相册”,由配置文件(包含相册标题、版权等)、缓存元数据(尺寸、缩略图、访问要求等)和实际图像组成。有些相册是私有(private)的,要求用户登录并具有特定的组成员身份。这部分很好地封装在 Album 类和负责管理实例的关联工厂中。在添加安全性之前, Controller 使用工厂来查找请求的Album实例,并将其放入模型中以供 View 使用。

然后我将 Spring Security 添加到其中。由于授权发生在 servlet 过滤器链中(在调用 Controller 之前),并且授权需要访问 Album 对象才能做出访问控制决策,因此我被迫定位/实例化 Album 在授权阶段。这感觉不太对劲,但我看不出有任何其他方法可以在不重复功能的情况下实现我的目标。

问题:将某些模型构建推回授权步骤是 Web 应用程序中的正常模式,还是我错过了一些重要的事情?顺便说一句,为了不查找/实例化模型对象两次,我计划将其作为属性放入 HttpServletRequest 中以供 Controller 使用。

最佳答案

既然我没有得到答案,我将分享我自己的见解。

我根本不理解 Spring 声明式安全模型的范围。如果您有一组资源具有基于登录用户的二进制可访问性状态(是/否),那么 Spring Security 的模型是合适的。如果您需要更细粒度的控制(即显示页面但根据登录用户定制其内容),那么您必须在页面生成时进行自己的过滤。

关于java - Spring MVC 和安全性 - 授权期间 protected 资源的识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32557125/

相关文章:

java - 在 Java Swing 中前置组件?

ajax - 使用 Jackson 解析器在 Spring MVC 中映射 JSON 数据

oop - 用于管理对象依赖关系的设计模式

python - 在 pydantic 模型中包含非验证方法是不好的做法吗?

java - 将 Spring 页面 View 限制为仅 POST

java - 为什么 AbstractCollection 同时实现了 Iterable 和 Collection?

java - 去除字符串中空格的方法

java - Spring 4.0.1 + quartz 1.5.2

java - Spring Data JPA 查询不起作用,列不存在

wpf - 什么时候不使用 MVVM?