java - 限制某些数据访问的正确方法是什么

标签 java spring spring-mvc spring-security

我正在开发一个应用程序,其中每个员工都有自己的客户。

当员工想要显示、修改或删除客户时,我想确保该客户是该员工之一。这是因为执行这些操作的 url 类似于

www.xxx.com/customers/update/{idCustomer}

我现在验证对客户的访问权限的方法是通过服务调用(具有数据库访问权限)来确保该客户是该员工之一。

该应用程序是使用 Spring MVC 和 Spring Security 编写的。我想知道是否有更好的方法来进行相同的限制访问?

最佳答案

我发现使用 hasPermission 可以方便地满足此类要求。具体来说,

  1. 通过使用 @EnableGlobalMethodSecurity(prePostEnabled = true) 注解配置类来启用方法安全性
  2. 在 Controller 中获取客户,然后调用服务方法,传递客户。
  3. 使用@PreAuthorize注释服务方法

    @PreAuthorize("hasPermission(#customer, 'edit')")
    public void updateCustomer(Customer customer, ...) {
    ...
    
  4. 您应该配置一个PermissionEvaluator,如下所示:

    @Component
    public class PermissionEvaluatorImpl implements PermissionEvaluator {
    
    @Override
    public boolean hasPermission(Authentication auth,
        Object entity, Object permission) {
    
            // return true only if auth has the given
            // permission for the customer.
            // Current user can be obtained from auth.
    }
    
    ...
    
    }
    
  5. 作为一种更简洁的模式,在上述方法中,您可以将权限检查委托(delegate)给实体类,如下所示:

    BaseEntity baseEntity = (BaseEntity) entity;
    return entity.hasPermission(Util.getUser(auth), (String) permission);
    

参见this了解更多详情。

关于java - 限制某些数据访问的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870844/

相关文章:

java - 将 JSON 响应映射到 POJO(使用不同的名称)

Java如何同步2个线程?

java - 无论如何强制线程上下文切换,特别是在像++这样的操作中?

java - 无法发布到黑板构建 block

java - 创建新用户帐户并发送电子邮件

java - Spring MVC maven项目中Tomcat8的插件名称是什么

java - 为什么我需要对对象数组中的特定引用进行强制转换?

java - 每次运行 Junit 测试时实体管理器都为空

java - 自定义权限评估器未被调用 : Spring security 3. 2

spring - 如何清理用于幂等 Spring 集成模式的元数据存储