gpt4 book ai didi

java - 在 Web 应用程序 Java EE/Spring 的一部分上实现自定义安全/过滤器

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:08 24 4
gpt4 key购买 nike

我正在开发一个 Java EE 网络应用程序,我在其中使用了 Spring MVC 和 Spring 安全性。到目前为止,我成功地使用自定义 userService(从我的数据库中检索信息)实现了常见的安全功能,但我现在面临一个新的安全问题,我真的不知道什么是解决它的最佳方法。 .

这是我需要做的:在我的应用程序中经过身份验证的用户可以浏览他们的项目,但只能打开他们有权打开的项目(并打开里面的内容),但不能打开其他项目。

我当前的实现是通过导航(用户界面)处理它,只向用户提供授权项目的列表。但是,如果聪明的用户直接编辑 URL 以使用另一个 ID 打开项目,则不会对项目 ID 进行授权测试,并且用户已完成,因此它可以毫无问题地打开项目。

所以,我想添加的是对每个打开项目或项目中的东西的请求的控制。此控件将测试请求的项目 ID 是否可以被当前用户打开。如果没有,它将返回给用户一个访问被拒绝的页面。这个控件本身很容易实现,但由于它是一些代码,可以在我的应用程序的许多方法中使用,所以我想找到最简洁的方法来实现它!

您认为实现它的最佳方式是什么?我考虑了几种可能性,但我需要建议:

1) 使用 servlet 过滤器 ?

2) 使用自定义 authenticationManager 添加对 Spring 安全的特殊访问?像这样的东西:

 <security:intercept-url pattern="/open*" access="canOpen()" /> 

(但我不确定如何定义它以及我是否能够从原始请求中获取参数...)

3) 使用面向方面的编程? (但我在某处读到它不适用于 Controller 调用)

4) 使用 Spring 拦截器?

5) 其他想法?

在此先感谢您的帮助!

最佳答案

我建议您使用自定义 PermissionEvaluator,这样您基本上可以在网页和 Controller 中使用相同的实现:

在您可以使用的网页中:
<security:authorize access="hasPermission(#project,'read')"></security:authorize>

在您的 Controller 和您可以使用的任何服务方法中:
@PreAuthorize("hasPermission(#project,'read')")

@PostAuthorize@PostFilter("hasPermission(filterObject,'read')") (对于列表)

所有这些功能将根据您自己的权限评估器限制访问或过滤结果列表。它们都指向相同的实现,看起来像这样:

@Component
public class MyPermissionEvaluator implements PermissionEvaluator {

private final Log logger = LogFactory.getLog(getClass());

@Override
public boolean hasPermission(Authentication auth, Object arg1, Object arg2) {
logger.info("hasPermission "+auth+" - "+arg1+" - "+arg2+" ");
if(arg2 instanceof String && arg1 instanceof MyProject){
MyProject project = (MyProject)arg1;
if(((String) arg2).equals("read")){
boolean result = hasPermissionReadProject(auth, project);
return result;
}
}
return false;
}

@Override
public boolean hasPermission(Authentication arg0, Serializable arg1,
String arg2, Object arg3) {
logger.info("hasPermission "+arg0+" - "+arg1+" - "+arg2+" - "+arg3+" ");
return false;
}
}

此外,当这些方法返回 false 时,它​​会自动抛出 AccessDeniedException,您可以轻松地将其配置为重定向到 http 元素中您自己的 accessDenied 页面:

<http auto-config="true">
<intercept-url pattern="/admin*" access="ROLE_ADMIN" />
<access-denied-handler error-page="accessDeniedPage"/>
</http>

关于java - 在 Web 应用程序 Java EE/Spring 的一部分上实现自定义安全/过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13475900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com